在下面的小样本中:
#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,它的析构函数将立即被调用.
通常:当函数返回非void值并且该值未存储在任何地方时,该值将被破坏。
具体来说:ints和doubles之类的自然数据类型或指针没有显式的析构函数,因此什么也没有发生。返回的值将被忽略。
如果函数返回类实例,则该类实例将被销毁,这将导致调用该类的已定义析构函数或默认析构函数。