3

我用 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;
}
4

1 回答 1

6

*ap是一个左值(§ 5.3.1.1,n3290),对于自动发生的移动通常是不安全的。局部变量return a;另一种情况。编译器不需要证明在这种特定情况下它是安全的。这是在您并不真正需要指针语义的情况下不使用指针的另一个很好的理由。

将其更改为:

return std::move(*ap);

但是会导致它被显式移动。

于 2012-11-28T18:38:54.317 回答