在下面的小样本中:
#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;
}
15岁会怎么样?我尝试在调试器中运行它,但我无法在任何地方找到它。我认为,因为它没有被分配到任何东西它只是消失但我觉得这是错的。
我今天向TA询问了这个问题,他告诉我它存储在调用堆栈中,但是当我在调试器中查看它时,我发现它不是。
答案 0 :(得分:12)
C ++标准规定了&#34; as-if&#34;规则。该规则意味着C ++编译器可以对程序执行任何操作,只要所有副作用(系统其余部分可见的输入和输出,如写入文件或在屏幕上显示内容)都得到遵守。回到我的cheeky philosophical comment,这意味着在C ++中,当一棵树落入森林而没有人在那里听到它时,它不会 发出声音(但它可以)。
对于您的程序,在高级别,由于您的函数什么也不做,编译器可能会也可能不会创建对它的调用,甚至可能从已编译的二进制文件中删除它。如果确实包含并调用它,则返回值将转到平台的应用程序二进制接口指定的任何返回槽。在几乎每个x86_64系统上,这将是整数返回值的rax
寄存器。返回值在那里,但永远不会被读取,并且会在某个时候被覆盖。
如果它是一个非平凡的对象而不是int
,它的析构函数将立即被调用。
答案 1 :(得分:4)
通常:当函数返回非void
值并且该值未存储在任何位置时,该值将被销毁。
具体来说:自然数据类型,如int
和double
或指针,没有明确的析构函数,所以没有真正发生。返回的值只会被忽略。
如果函数返回一个类实例,则会破坏类实例,这会导致调用类定义的析构函数或默认的析构函数。