当“Class&&”类型的变量用作参数时,为什么要复制ctor而不是move ctor

时间:2015-02-26 16:50:54

标签: c++ constructor copy-constructor move-constructor

考虑以下代码:

#include <iostream>

struct S
{
    S() {std::cout << "default ctor\n";}
    S(const S&) {std::cout << "copy ctor\n";}
    S(S &&) {std::cout << "move ctor\n";}
};

int main() {
    S base;
    S &&ref = (S&&)base;
    S obj(ref);
    return 0;
}

令人惊讶S obj(ref);调用复制ctor而不是移动ctor 但如果我用S obj((S&&)ref);替换此行,则按预期调用ctor。

为什么会这样?为什么我需要强制转换来调用移动构造函数?

1 个答案:

答案 0 :(得分:2)

作为表达式,ref左值,就像命名任何类型变量的任何表达式一样。因此它将绑定到 lvalue 引用(对于复制构造函数),但不是 rvalue 引用(对于移动构造函数)。

使用std::move(或等效的强制转换表达式)给出一个表示对象的 rvalue 表达式。这将绑定到 rvalue 引用,因此选择了移动构造函数。