如果我不将它存储在任何地方,返回值会发生什么变化?

Cal*_*lat 5 c++

在下面的小样本中:

#include<iostream>
using namespace std;

int z(){
    return 5 + 10; // returns 15
}

int main(){
    z(); // what happens to this return?
    cout << "Did not fail";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

15岁会怎么样?我尝试在调试器中运行它,但我无法在任何地方找到它.我认为,因为它没有被分配到任何东西它只是消失但我觉得这是错的.

今天我向TA询问了这个问题,他告诉我它存储在调用堆栈中,但是当我在调试器中查看它时,我发现它不是.

zne*_*eak 13

C++标准强加了"as-if"规则.该规则意味着C++编译器可以对程序执行任何操作,只要所有副作用(系统其余部分可见的输入和输出,如写入文件或在屏幕上显示内容)都得到遵守.让我们回到我的厚脸皮的哲学评论,这意味着,在C++中,当树倒在森林中,并没有一个人听到它,它不会发出声音(但它可以).

对于您的程序,在高级别,由于您的函数什么也不做,编译器可能会也可能不会创建对它的调用,甚至可能从已编译的二进制文件中删除它.如果确实包含并调用它,则返回值将转到平台的应用程序二进制接口指定的任何返回槽.在几乎每个x86_64系统上,这将是rax整数返回值的寄存器.返回值在那里,但永远不会被读取,并且会在某些时候被覆盖.

如果它是一个非平凡的对象而不是一个int,它的析构函数将立即被调用.

  • 作为参考,[编译二进制](https://godbolt.org/g/ZPa39l)中的所有`icc`,`clang`和`gcc`仍然是_include_`z()`,但它们都没有实际调用它.也许这是因为编译器通常不能排除不一定是编译单元本地的符号(我想你可以某种方式链接或动态加载它).如果你将`z()`声明为`static`,[以上所有都完全省略它](https://godbolt.org/g/3Fa2MH).当编译器看不到`z()`的主体时,仍然会调用该函数,但返回值`eax` [被忽略](https://godbolt.org/g/w72NWM). (3认同)

Sam*_*hik 5

通常:当函数返回非void值并且该值未存储在任何地方时,该值将被破坏。

具体来说:ints和doubles之类的自然数据类型或指针没有显式的析构函数,因此什么也没有发生。返回的值将被忽略。

如果函数返回类实例,则该类实例将被销毁,这将导致调用该类的已定义析构函数或默认析构函数。