为什么'控制到达无效功能的结束'只是一个警告?这合法吗?

时间:2014-11-19 08:09:57

标签: c++ return-value compiler-warnings undefined-behavior

使用非void返回类型定义一个允许控制到达函数末尾而不是到达 return 语句的函数是合法的C ++吗?

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

GCC

  

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

铛:

  

警告:控制到达非空函数的末尾[-Wreturn-type]

如果这是合法的,是否会定义返回值的行为?

2 个答案:

答案 0 :(得分:5)

正如Bathsheba已经说过的那样,流出一个非空函数的结尾确实是未定义的行为。这是一个警告而不是错误的原因是你可以证明这种情况永远不会发生。例如,考虑一下:

// 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_始终至少为4foo将始终正常工作。就个人而言,我仍然会避免这种情况,因为它会损害可维护性和可读性,但它比免费版更好,因为现在&#34;只有&#34; 所有类维护者都需要担心这个不变/可以犯了错误。

答案 1 :(得分:4)

来自C ++ Standard,6.6.3:

  

离开函数末尾相当于没有返回   值;这会导致值返回时出现未定义的行为   功能

因此没有明确的返回值是未定义的行为