考虑以下代码:
#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。
为什么会这样?为什么我需要强制转换来调用移动构造函数?
答案 0 :(得分:2)
作为表达式,ref
是左值,就像命名任何类型变量的任何表达式一样。因此它将绑定到 lvalue 引用(对于复制构造函数),但不是 rvalue 引用(对于移动构造函数)。
使用std::move
(或等效的强制转换表达式)给出一个表示对象的 rvalue 表达式。这将绑定到 rvalue 引用,因此选择了移动构造函数。