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

Я скомпилировал этот код с vs2011. Печатает первым конструктор затем конструктор копирования.
Но если я изменю функцию, чтобы вернуть вместо ар, это переместит объект. Это ошибка или почему она так себя ведет? * 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;
}

3

Решение

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

Меняя это на:

return std::move(*ap);

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

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]