在C++中省略return语句

Lin*_*ity 21 c++ g++ strawberry-perl

我刚从草莓Perl的g ++版本获得了一些奇怪的行为.它允许我省略一个return语句.

我有一个成员函数,它返回一个由两个指针组成的结构,称为boundTag:

struct boundTag Box::getBound(int side) {
    struct boundTag retBoundTag;
    retBoundTag.box = this;
    switch (side)
    {
        // set retBoundTag.bound based on value of "side"
    }
}
Run Code Online (Sandbox Code Playgroud)

这个函数给了我一些不好的输出,我发现它没有返回语句.我原本打算回来,retBoundTag但忘了真正写回报.一旦我添加return retBoundTag;一切都很好.

但我测试了这个功能,并boundTag从中获得了正确的输出.即使是现在,当我删除return语句时,g ++会在没有警告的情况下编译它.WTF?猜它会回来retBoundTag吗?

Pra*_*rav 17

省略函数[Except ]中的return语句并使用代码中返回的值调用Undefined Behavior.non-voidmain()

ISO C++ - 98 [第6.6.3/2节]

带表达式的return语句只能用于返回值的函数; 表达式的值返回给函数的调用者.如果需要,表达式将隐式转换为其出现的函数的返回类型.return语句可以包含临时对象(class.temporary)的构造和复制.流出函数末尾相当于没有值的返回; 这会导致值返回函数中的 未定义行为.

例如

int func()
{
    int a=10;
    //do something with 'a'
    //oops no return statement
}


int main()
{
     int p=func();
     //using p is dangerous now
     //return statement is optional here 
}
Run Code Online (Sandbox Code Playgroud)

通常g ++给出一个warning: control reaches end of non-void function.尝试使用-Wall选项进行编译.

  • 省略退货声明没问题.执行到达函数末尾而不遇到return语句会导致未定义的行为.您可以在到达函数结束之前返回,或者通过抛出异常离开,或者根本不离开,并且所有内容都将被很好地定义. (7认同)
  • @yuvi - 按照标​​准你可以安全地省略main()中的return语句,返回的值默认为0. (3认同)
  • @ajay:那是因为is不包含任何指定的值. (2认同)

jal*_*alf 13

C和C++不要求你有一个return语句.可能没有必要有一个,因为函数进入无限循环,或者因为它抛出异常.

Prasoon已经引用了该标准的相关部分:

[第6.6.3/2条]

带表达式的return语句只能用于返回值的函数; 表达式的值返回给函数的调用者.如果需要,表达式将隐式转换为其出现的函数的返回类型.return语句可以包含临时对象(class.temporary)的构造和复制.流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.

这意味着没有退货声明是可以的.但是到达函数的末尾而不返回是未定义的行为.

编译器不能总是检测到这些情况,因此不需要编译错误(它必须解决暂停问题以确定执行是否实际到达函数的末尾).如果发生这种情况,它应该是未定义的.它似乎可行(因为调用函数只会查看返回值所在位置的垃圾值),它可能会崩溃,或者让恶魔飞出你的鼻子.

  • 感谢您解释为什么在非void函数中没有显式的return语句不是编译错误:) (3认同)