如何使用右值调用复制构造函数

时间:2018-07-04 05:07:49

标签: c++11 copy-constructor move-semantics move-constructor copy-elision

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中编译。

1 个答案:

答案 0 :(得分:1)

来自en.cppreference.com:

  

如果同时提供了复制和移动构造函数,则没有其他   构造函数是可行的,重载分辨率可以选择   构造函数,如果参数是相同类型的右值(xvalue   例如std :: move的结果或prvalue(例如无名)的结果   临时(直到C ++ 17)),如果   参数是左值(返回的命名对象或函数/运算符   左值参考)。如果仅提供副本构造函数,则全部   参数类别选择它(只要它引用了   const,因为右值可以绑定到const引用),这使得   当移动不可用时,复制后备以进行移动。

这显然表明rvalue可以绑定到const lvalue引用。