为什么析构函数不会被调用匿名对象?

Man*_*mar 1 c++ oop anonymous copy-constructor c++11

在工作的时候,我遇到了一段奇怪/令人困惑的代码,我觉得这些代码与匿名 对象生命周期概念有关.以下是示例代码:

#include<iostream>
#include<string>

class A {
private:
    int i;
    std::string s;
public:
    A(int ii, std::string ss = "Hello") { i = ii; s = ss; }
    void Display() { std::cout<<i<<"\n"; }
    ~A() { std::cout<<"A::~A()"<<"\n";}
};

void function()
{
    A a = 1;
    //A a = A(1);
    a.Display();
}

int main()
{
    function();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

VS2010中的输出1(如果A a = 1)

 1
  A::~A()
Run Code Online (Sandbox Code Playgroud)

VS2010中的输出2(如果A a = A(1))

A::~A()
1
A::~A()
Run Code Online (Sandbox Code Playgroud)

析构函数被调用两次(包括匿名)对象时,output2完全有意义.

但是输出1让我困惑,无法理解为什么析构函数被调用一次(不是匿名)对象.

A a = 1;
Run Code Online (Sandbox Code Playgroud)

上面的行将调用类的copy-constructor(A(const A& rhs))A,编译器应该使用参数创建匿名对象1.如果是这种情况,析构函数应该被调用两次.

有人可以解释一下这种行为吗?可能是我遗漏了一些明显的东西.

M.M*_*M.M 8

A a = A(1);相当于A a = 1;.但是,在这两种情况下,都可能出现复制省略:A(1)实际上是直接构造a,而不是单独构造,然后复制或移动.

由编译器决定是否在任何允许的场景中执行复制省略(如上面的链接所述).