关于C++ const右值引用绑定及std::move调用的疑问
关于std::move作用于const左值的两个问题解析
假设你的类定义大致如下:
class C { public: void set(std::string&&) { /* 非const右值引用重载 */ } void set(const std::string&&) { /* const右值引用重载 */ } };
一、为何会绑定到const std::string&&重载
当你调用std::move(const_lvalue)时,const_lvalue的类型是const std::string,std::move的推导逻辑会生成返回类型const std::string&&——因为std::move的本质是static_cast<T&&>(t),这里的T会被推导为const std::string,所以结果是一个const右值。
而C++中,非const的右值引用(std::string&&)只能绑定到非const的右值,无法绑定到const右值;只有const std::string&&才能匹配这个类型,所以最终会调用对应的重载。
二、C++为何允许对const对象调用std::move
std::move本身并不做任何“移动”操作,它只是一个编译期的类型转换:把传入的表达式转换为对应的右值引用类型,不管原对象是不是const。
从语法上来说,static_cast<const std::string&&>(const_lvalue)是完全合法的——转换并没有试图移除对象的const属性,只是改变了它的值类别(从左值变成右值)。虽然拿到const std::string&&后你无法修改对象,通常也没法实现有意义的资源窃取(因为移动构造/赋值一般要求可修改源对象),但语法上并没有禁止这种转换,标准允许std::move作用于任何类型的表达式,包括const左值。
内容的提问来源于stack exchange,提问作者Robert Kubrick
相关产品推荐
相关产品推荐

