鉴于以下代码:

#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()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top