#include <iostream>
class A {
public:
A() { std::cout << "Constructor" << std::endl; }
A(const A& a) { std::cout << "Copy Constructor" << std::endl; }
A& operator=(const A& a) { std::cout << "Copy = operator" << std::endl; }
A(A&& a) { std::cout << "Move Constructor" << std::endl; }
A& operator=(A&& a) { std::cout << "Move = operator" << std::endl; }
~A() { std::cout << "Destructor" << std::endl; }
};
void f(A&& a) { std::cout << "function" << std::endl; }
int main() {
f(A());
return 0;
}
Вывод следующей программы:
Constructor
function
Destructor
Почему здесь не вызывается конструктор перемещения? Кажется, что копирование происходит, даже если я компилирую с флагом -fno-elide-constructors: g++ test.cpp -fno-elide-constructors -std=c++11
A()
вызывает конструктор по умолчанию, тогда анонимный временный объект может привязываться кf(A&&)
. Что мне не хватает? Конструктор перемещения можно вызвать только при наличии сконструированного объекта. - person Bathsheba   schedule 25.11.2016A foo();
, тогдаA a{foo()};
вызовет конструктор перемещения, но в нынешнем виде двигаться не к чему. - person Martin Bonner supports Monica   schedule 25.11.2016std::endl
, если вам не нужны дополнительные функции, которые он делает;'\n'
заканчивает строку. - person Pete Becker   schedule 25.11.2016