C++ 为什么没有为匿名对象调用析构函数?
在工作中,我遇到了一段奇怪/令人困惑的代码,我觉得这段代码与匿名对象生命周期概念有关。下面是代码示例:C++ 为什么没有为匿名对象调用析构函数?,c++,oop,c++11,copy-constructor,anonymous,C++,Oop,C++11,Copy Constructor,Anonymous,在工作中,我遇到了一段奇怪/令人困惑的代码,我觉得这段代码与匿名对象生命周期概念有关。下面是代码示例: #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&l
#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;
}
VS2010中的输出2(如果A=A(1))
1
A::~A()
A::~A()
1
A::~A()
输出2非常有意义,因为析构函数被调用两次(包括匿名)对象
然而,output1让我困惑,无法理解为什么析构函数被调用一次(而不是匿名)对象
上行将调用类A
的复制构造函数(A(const A&rhs)
),编译器应使用参数1
为其创建匿名对象。如果是这种情况,析构函数应该被调用两次
有人能给我解释一下这种行为吗?。可能是我遗漏了一些明显的东西。您的编译器正在删除
A A=1的副本,而不是A=A(1)代码>,gcc能够在这两种情况下复制,这可以用-fno elide构造函数测试您的编译器正在为A A=1
而不是A=A(1)删除副本代码>,gcc能够在这两种情况下复制,这可以用-fno elide构造函数测试A=A(1)代码>相当于A=1代码>。但是,在这两种情况下都可能发生:A(1)
实际上直接构造到A
,而不是单独构造然后复制或移动
由编译器决定是否在任何允许的情况下(如上面的链接所述)执行复制省略代码>相当于A=1代码>。但是,在这两种情况下都可能发生:A(1)
实际上直接构造到A
,而不是单独构造然后复制或移动
由编译器决定是否在任何允许的场景中执行复制省略(如上面的链接所述)。fno-elide构造函数标志对于理解这一点非常有用。fno-elide-constructors标志对于理解这一点非常有用。
A a = 1;