【发布时间】:2016-06-12 21:59:41
【问题描述】:
这是我的代码:
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(); 起作用,看到右手边也是一个命名对象?
【问题讨论】:
-
您希望发生什么?
-
我希望它能与 `A d = A e(4);参与。
-
那是错误的。可能类似于使用声明语句作为表达式,但我不是真正的语法人。
-
@flatmouse:我不愿将国际专家委员会的标准化结果称为“教条”,但 WG21 会议和尼西亚委员会之间的相似之处很难消除。提案、研究小组、民意调查、措辞审查……我想不同之处在于标准可以更改,错误的实施者不会被逐出教会。
-
foo()不是命名对象
标签: c++ constructor copy-constructor