C++中用右值引用参数初始化对象时为何未调用移动构造函数?
问题核心原因
你遇到的问题本质是混淆了变量的类型和表达式的值类别两个独立的C++语法概念:
- 函数参数
x的类型是T&&(右值引用),仅表示它可以绑定到右值上,用于支持移动语义的参数传递 - 但有名字的右值引用变量本身属于左值:你可以对它执行取地址操作(
&x是合法表达式),符合左值的核心特征
构造函数匹配逻辑
你的两个构造函数的入参约束分别是:
- 拷贝构造
T(T& other):要求绑定到非const左值 - 移动构造
T(T&& other):要求绑定到右值
你在foo中写的T y(x);里,x是左值,无法匹配移动构造的右值入参要求,编译器只能匹配到可以接受左值的拷贝构造函数。
修复方案
如果要强制调用移动构造,需要用std::move将左值x显式转为右值:
void foo(T&& x) { T y(std::move(x)); // 此时会调用移动构造函数 }
std::move本身只做类型转换,不做任何实际的移动操作,它的作用就是把输入的左值转为亡值(属于右值的一种),从而可以匹配移动构造的入参要求。
内容的提问来源于stack exchange,提问作者mouse_00
相关产品推荐
相关产品推荐

