我用vs2011编译了这段代码。它首先打印构造函数,然后打印复制构造函数。 但是如果我更改函数以返回 a 而不是 ap ,它将移动对象。这是一个错误还是为什么它会像这样? * ap不是右值吗?
struct A
{
A() { cout << "constructor" << endl;}
A(const A&) { cout << "copy constructor " << endl;}
void operator=(const A&) { cout << "assignment operator" << endl; }
A( A&&) { cout << "move copy constructor" << endl;}
void operator=(A&&) { cout << "move assignment operator" << endl;}
};
A func() { A a; A *ap = &a; return *ap; }
int main()
{
A a = func();
return 0;
}
答案 0 :(得分:6)
*ap
是左值(§5.3.1.1,n3290),对于自动发生的移动通常是不安全的。局部变量return a;
是different case。编译器无需证明在此特定情况下它是安全的。这是在你不真正想要指针语义的情况下不使用指针的另一个好理由。
将其更改为:
return std::move(*ap);
会导致它被明确移动。