所以这是我的代码:
class A {
int x;
public:
A(int p) {cout << "constructor\n"; }
A(const A& p) { cout << "copy constructor\n";}
A& operator=(const A& p) { cout << "assignment\n"; return *this;}
~A() {cout << "destructor\n";}
};
A foo(){ A temp(3); return temp;}
int main()
{
A a(1);
A b = A(2);
A c = foo();
//A d = A e(4); This one doesn't work!
}
我知道匿名对象(未命名对象)具有“表达式范围”,这意味着它们在创建它们的表达式的末尾被销毁。这意味着,在我们的代码中,未命名的对象一直存在,直到分号。
在12.2 / 3中说明:
临时对象在评估全表达式(1.9)的最后一步时被销毁,该表达式(词法上)包含创建它们的点。
所以,我知道命名对象和未命名对象在范围方面是不同的。
我的问题是为什么最后一行代码不起作用?范围是否与它有关?
为什么A c = foo();
有效,看到正确的双手也是命名对象?
答案 0 :(得分:4)
初始化需要右侧的表达式。 A e(4)
不是表达式,而是声明。它没有价值。
答案 1 :(得分:1)
//A d = A e(4); This one doesn't work!
这只是无效的语法。您不需要e
,甚至在任何地方都不会被引用。
您的陈述应该是
A d = A(4);
或
A d(4);
答案 2 :(得分:0)
您可以使用A d = a;
来调用复制构造函数。
这种情况A c = foo();
由编译器减少到这种情况A b = A(2);
,因为右侧的实体在分配后停止生存,它可以简单地使用右侧而不是左侧。