You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于右值引用与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:37:06