Возврат указателя по значению не перемещает объект

Я скомпилировал этот код с помощью 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;
}

person hidayat    schedule 28.11.2012    source источник


Ответы (1)


*ap — это lvalue (§ 5.3.1.1, n3290), которое, как правило, небезопасно для автоматического перемещения. Локальная переменная return a; — это другой случай. От компилятора не требуется доказывать, что в данном конкретном случае это будет безопасно. Это еще одна веская причина не использовать указатели в тех случаях, когда вам не нужна семантика указателей.

Изменение его на:

return std::move(*ap);

однако приведет к его явному перемещению.

person Flexo    schedule 28.11.2012
comment
значение x!? Внезапно я чувствую себя ужасно оторванным от реальности. Спасибо за ссылку. - person NPE; 28.11.2012