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选项进行编译.
jal*_*alf 13
C和C++不要求你有一个return语句.可能没有必要有一个,因为函数进入无限循环,或者因为它抛出异常.
Prasoon已经引用了该标准的相关部分:
[第6.6.3/2条]
带表达式的return语句只能用于返回值的函数; 表达式的值返回给函数的调用者.如果需要,表达式将隐式转换为其出现的函数的返回类型.return语句可以包含临时对象(class.temporary)的构造和复制.流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.
这意味着没有退货声明是可以的.但是到达函数的末尾而不返回是未定义的行为.
编译器不能总是检测到这些情况,因此不需要编译错误(它必须解决暂停问题以确定执行是否实际到达函数的末尾).如果发生这种情况,它应该是未定义的.它似乎可行(因为调用函数只会查看返回值所在位置的垃圾值),它可能会崩溃,或者让恶魔飞出你的鼻子.