3

このコードを vs2011 でコンパイルしました。最初にコンストラクターを出力し、次にコンストラクターをコピーします。しかし、関数をapの代わりにaを返すように変更すると、オブジェクトが移動します。これはバグですか、それともなぜこのように動作するのですか? *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 is an lvalue (§ 5.3.1.1, n3290) which is in general not safe for the move to happen automatically. The local variable return a; is a different case. There's no requirement for the compiler to prove that in this specific instance it would be safe. This is another good reason for not using pointers in cases where you don't really want pointer semantics.

Changing it to:

return std::move(*ap);

will cause it to be explicitly moved however.

于 2012-11-28T18:38:54.317 に答える