c – 按值返回指针不会移动对象

我用vs2011编译了这段代码.它打印第一个构造函数然后复制构造函数.
但是如果我改变函数返回a而不是ap,它将移动对象.这是一个错误还是为什么它会像这样? * ap不是rvalue吗?

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;
}

解决方法:

* ap是左值(§5.3.1.1,n3290),对于自动发生的移动通常是不安全的.局部变量返回一个;是different case.编译器无需证明在这个特定情况下它是安全的.这是在你不真正想要指针语义的情况下不使用指针的另一个好理由.

将其更改为:

return std::move(*ap);

会导致它被明确地移动.

上一篇:c – 与r值和l值混淆


下一篇:Real-Time Rendering 笔记