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
for a2
使用复制省略,这是对编译器的优化,一切似乎都很好。但是,当我注释掉move构造函数时,将调用copy构造函数来代替move构造函数。如何将右值转换为常量左值引用?
输出:
constructor
copy constructor
constructor
copy constructor
程序在VS2017
中编译。
答案 0 :(得分:1)
来自en.cppreference.com:
如果同时提供了复制和移动构造函数,则没有其他 构造函数是可行的,重载分辨率可以选择 构造函数,如果参数是相同类型的右值(xvalue 例如std :: move的结果或prvalue(例如无名)的结果 临时(直到C ++ 17)),如果 参数是左值(返回的命名对象或函数/运算符 左值参考)。如果仅提供副本构造函数,则全部 参数类别选择它(只要它引用了 const,因为右值可以绑定到const引用),这使得 当移动不可用时,复制后备以进行移动。
这显然表明rvalue可以绑定到const lvalue引用。