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不返回任何值; 但没有编译器警告或错误!为什么?
C++编译器不需要在不返回值的情况下发出诊断,但如果您的程序退出非void函数(除了main())而没有返回语句,则该行为是未定义的.也就是说,编译器编译代码是合法的,但是调用此函数f()是不合法的,因为它会导致未定义的行为.
不要求编译器发出诊断(即,使行为未定义)的主要原因是,有时无法判断函数是否确实从函数返回.例如,想象一下这样的函数:
int f() {
if(somecondition) { return 0; }
this_function_throws();
}
Run Code Online (Sandbox Code Playgroud)
其中,this_function_throws()在一个单独的翻译单位和最终总是抛出异常.
它是未定义的行为,但编译器不需要报告此情况.
C++ 11(ISO/IEC 14882:2011)§6.6.3 返回语句
不带表达式的return语句只能用于不返回值的函数,即返回类型为void的函数,构造函数(12.1)或析构函数(12.4).表达式为非void类型的return语句只能用于返回值的函数; 表达式的值返回给函数的调用者.表达式隐式转换为它出现的函数的返回类型.return语句可以包含临时对象的构造和复制(12.2).流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.