关于右值引用与const引用的疑问:为何优先选右值引用?
为什么右值引用版本的函数会被优先调用?
先看你的代码示例:
int f(const std::string& str) { return 1; } int f(std::string&& str) { return 2; } int main() { std::cout << f("Hello!") << std::endl; // 实际输出2 }
核心原因是C++重载决议的匹配优先级规则:
- 你传递的
"Hello!"是const char*类型的右值,要调用f(const std::string&),需要先隐式构造一个临时std::string对象,再把这个临时对象绑定到const左值引用上。 - 而调用
f(std::string&&)时,同样需要构造临时std::string,但这个临时对象本身就是右值,能直接绑定到右值引用参数上——这个匹配属于完全匹配,比绑定到const左值引用的匹配度更高,所以编译器会优先选择这个版本。
你觉得“青睐常量特性”没错,但那是在没有专门右值重载的情况:const左值引用确实能同时接受左值和右值,但一旦存在针对右值的重载,编译器会优先选择更贴合右值场景的版本。
这种设计的实际意义在于效率:当参数是临时对象这类右值时,右值引用版本可以直接接管它的内部资源(比如std::string的内存缓冲区),避免不必要的拷贝操作,比const引用版本的处理方式高效得多。
内容的提问来源于stack exchange,提问作者Captain Giraffe
相关产品推荐
相关产品推荐

