没有警告该函数int f()不返回任何值?

xml*_*lmx 3 c++ compiler-construction visual-c++ c++11

struct A
{
    int f()
    {} // Notice here! 
};

int main()
{
    A a;
    a = a;
}
Run Code Online (Sandbox Code Playgroud)

我的编译器是最新的VC++编译器(Visual Studio 2013 Preview)

函数A :: f不返回任何值; 但没有编译器警告或错误!为什么?

Die*_*ühl 7

C++编译器不需要在不返回值的情况下发出诊断,但如果您的程序退出非void函数(除了main())而没有返回语句,则该行为是未定义的.也就是说,编译器编译代码是合法的,但是调用此函数f()是不合法的,因为它会导致未定义的行为.

不要求编译器发出诊断(即,使行为未定义)的主要原因是,有时无法判断函数是否确实从函数返回.例如,想象一下这样的函数:

int f() {
    if(somecondition) { return 0; }
    this_function_throws();
}
Run Code Online (Sandbox Code Playgroud)

其中,this_function_throws()在一个单独的翻译单位和最终总是抛出异常.

  • §6.6.3/ 2是相关的标准. (2认同)

Yu *_*Hao 6

它是未定义的行为,但编译器不需要报告此情况.

C++ 11(ISO/IEC 14882:2011)§6.6.3 返回语句

不带表达式的return语句只能用于不返回值的函数,即返回类型为void的函数,构造函数(12.1)或析构函数(12.4).表达式为非void类型的return语句只能用于返回值的函数; 表达式的值返回给函数的调用者.表达式隐式转换为它出现的函数的返回类型.return语句可以包含临时对象的构造和复制(12.2).流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.