为什么'control reaches end of non-void function'只是一个警告?合法吗?


定义

一个具有非 void 返回类型的函数是否合法C++,该返回类型允许控件到达函数的末尾而不是到达返回语句?

gccclang仅为此发出警告。这样做的代码是合法的,还是这些编译器只是慷慨的?

海湾合作委员会:

警告:函数中没有返回语句返回非 void [-返回型]

铛:

警告:控制达到非无效功能结束 [-返回类型]

如果这是合法的,是否有定义的行为来返回什么值?

正如拔示巴已经说过的,从非空函数的末尾流出确实是未定义的行为。这是警告而不是错误的原因是,您可能能够证明这永远不会发生。例如,考虑一下:

// My magic function.
// It is forbidden to call it with values between -5 and 5
bool fun (int i) {
    if (i >= 5)
        return true;
    if (i <= -5)
        return false;
}

现在,只要函数的用户仔细阅读注释,您就已经明确定义了行为。这显然是一件危险的事情,因此编译器警告您不要这样做。

编辑:正如 MSalters 所提到的,这对于私有成员函数的危险性较小,因为类不变性可以保证函数永远不会被错误使用。请考虑以下示例:

// Every member function of SomeClass makes sure 
// that i_ is in the legal range when it's done
class SomeClass {
    public:
        SomeClass () : i_{27} {}
    // Possibly more public or private functions that all make sure i_ stays valid
    private:
        bool foo () {if (i_ > 3) return true;}
        int i_;
};

现在,您(作为类维护者)可以确保i_始终至少4并且foo始终正常工作。就个人而言,我仍然会避免这样做,因为它会损害可维护性和可读性,但它比免费版本更好,因为现在"只有"所有类维护者都需要担心这种不变性/可能会犯错误。

来自C++ Standard,6.6.3:

从函数末尾流出等效于没有的返回 价值;这会导致值返回中出现未定义的行为 功能。

因此,没有显式返回值是未定义的行为

最新更新