MWE:
struct A {
A() {std::cout << "constructor" << std::endl; }
A(const A& a) {std::cout << "copy constructor" << std::endl; }
A(A&& a) {std::cout << "move constructor" << std::endl; }
};
int main() {
A a1{};
A a2{ a1 };
A a3{ A{} };
A a4{ std::move(a3) };
return 0;
}
Выход:
constructor
copy constructor
constructor
move constructor
для a2
copy elision используется, что является оптимизацией компилятора, и все вроде бы хорошо. Однако, когда я закомментирую конструктор перемещения, вместо конструктора перемещения вызывается конструктор копирования. Как можно преобразовать rvalue в ссылку на const lvalue?
Выход:
constructor
copy constructor
constructor
copy constructor
Программа скомпилирована в VS2017
.