在表达C ++临时对象的破坏
-
11-09-2019 - |
题
鉴于以下代码:
#include <iostream>
struct implicit_t
{
implicit_t(int x) :
x_m(x)
{
std::cout << "ctor" << std::endl;
}
~implicit_t()
{
std::cout << "dtor" << std::endl;
}
int x_m;
};
std::ostream& operator<<(std::ostream& s, const implicit_t& x)
{
return s << x.x_m;
}
const implicit_t& f(const implicit_t& x)
{
return x;
}
int main()
{
std::cout << f(42) << std::endl;
return 0;
}
我得到以下输出:
ctor
42
dtor
虽然我知道这是正确的,我不能确定的为什么的。是否有与STDC ++知识的人会是谁给我解释一下?
解决方案
临时对象被销毁作为评价全表达式(1.9),该(词法)包含在其中创建它们的点的最后一步。 [12.2 / 3]
其他提示
12.2临时对象,第3条:“临时对象被销毁作为评价全表达式(1.9)的最后一个步骤,该步骤(词法)包含在其中创建它们的点”
1.9程序执行,第12条:“一个完整的表达是不另一种表达的子表达式的表达式”
由于存在可以接受)传递到F(参数函数编译把参数的堆栈上之前创建在运行中对象的构造。如可以在下面的拆解来看看。文字数字被默认当作整数所以有一个可接受的转化率。
001115C5 call implicit_t::implicit_t (11112Ch)
001115CA mov dword ptr [ebp-4],0
001115D1 mov esi,esp
001115D3 mov eax,dword ptr [__imp_std::endl (11A308h)]
001115D8 push eax
001115D9 lea ecx,[ebp-0D4h]
001115DF push ecx
001115E0 call f (111113h)
您临时对象挂起直到周围的表达被完全评估。这可以如果添加另一个调用您的功能变得更加明显。
int main()
{
std::cout << f(42) << std::endl;
std::cout <<f(80) << std::endl;
return 0;
}
,其具有一个输出
ctor
42
dtor
ctor
80
dtor
f(42)
隐式构造一个无名implicit_t
。它一生为它的持续时间是一个包含范围,就像任何auto
变量会。自然地,D'TOR被调用上return 0;
的main()
。
不隶属于 StackOverflow