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

int main()
{
    A a;
    a = a;
}

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

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

4

2 回答 2

7

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

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

int f() {
    if(somecondition) { return 0; }
    this_function_throws();
}

wherethis_function_throws()在一个单独的翻译单元中并且总是最终抛出异常。

于 2013-08-26T02:58:36.747 回答
6

这是未定义的行为,但编译器不需要报告这一点。

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

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

于 2013-08-26T02:59:01.820 回答