struct A {};
A f1()
{
return A();
}
int f2()
{
return int();
}
int main()
{
f1() = A(); // OK
f2() = int(); // error C2106: '=' : left operand must be l-value
}
为什么f1() = A();
在f2() = int();
失败时正常?
答案 0 :(得分:3)
f1()
返回A
的实例。由于您没有覆盖复制/移动赋值运算符,编译器会为您生成一个。你实际上是在调用一个成员函数:
f1() = A(); // calls A& operator=(A&&)
第二个不起作用,因为int
不是类类型。
答案 1 :(得分:2)
函数f1返回一个rvalue,它可能变成xvalue(“eXpiring”值)。函数f2返回一个内置类型,它是一个值为prvalue(“纯”rvalue)的右值。
从3.10 [Lvalues and rvalues]
- xvalue(“eXpiring”值)通常也指对象 接近其生命周期结束(以便其资源可以移动,因为 例)。 xvalue是某些表达式的结果 涉及右值参考(8.3.2)。
因此,由于隐式移动操作,A的分配变得有效。
将A更改为:
struct A {
A() {}
A(A&&) = delete;
A& operator = (const A&) { return *this; }
};
产生:错误:使用已删除的函数'A :: A(A&&)'与g ++(Ubuntu / Linaro 4.7.2-2ubuntu1)4.7.2