C++ 按值返回指针不会移动对象

C++ 按值返回指针不会移动对象,c++,c++11,move-semantics,rvalue,C++,C++11,Move Semantics,Rvalue,我用vs2011编译了这段代码。它首先打印构造函数,然后复制构造函数。 但是如果我将函数更改为返回a而不是ap,它将移动对象。这是一个bug还是它为什么会这样?ap不是右值吗 struct A { A() { cout << "constructor" << endl;} A(const A&) { cout << "copy constructor " << endl;} void operator=(const A&

我用vs2011编译了这段代码。它首先打印构造函数,然后复制构造函数。 但是如果我将函数更改为返回a而不是ap,它将移动对象。这是一个bug还是它为什么会这样?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;
}
结构A {
A()是左值(§5.3.1.1,n3290)通常,自动进行移动是不安全的。局部变量
返回a;
是a。编译器不需要证明在这个特定实例中它是安全的。这是在不需要指针语义的情况下不使用指针的另一个很好的原因

将其更改为:

return std::move(*ap);
但是会导致它被显式移动。

一个xvalue!?突然之间,我感到非常不联系。谢谢你的链接。