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

《C++ Primer》万能引用模板重载与实参推导相关疑问

问题1解答

《C++ Primer》的注释是场景化的简化表述,本质原因是转发引用(万能引用)的模板推导规则和重载决议优先级:
当你传入常量右值(比如std::move(ci))时,模板参数T会被推导为int const,最终T&&折叠为int const&&,这是对常量右值的完全匹配;而T const&虽然也能绑定常量右值,但属于「绑定到const引用」的次优匹配,重载决议会优先选择完全匹配的第一个版本。
同时你传入左值i也调用了第一个版本也能印证这一点:左值传入转发引用时T被推导为int&,引用折叠后得到int&,也是比int const&更优的完全匹配。

问题2解答

存在两种隐式触发的常见场景:

  • 传入花括号初始化列表:花括号初始化列表属于模板参数推导的非推导语境,转发引用无法完成T的推导,第一个重载会被排除出候选集,此时会自动匹配第二个T const&版本,例如:
    f({1, 2, 3}); // 自动调用f(T const&)
    
  • 传入重载的函数名:重载函数名同样属于非推导语境,转发引用无法推导类型,也会自动匹配第二个重载。

问题3解答

你的判断完全正确,原注释确实不准确。
转发引用本身可以绑定所有值类别(左值、非常量右值、常量右值)的参数,只要没有更优的重载存在。原注释只提到了「绑定非常量右值」,遗漏了左值、常量右值的匹配场景,属于简化表述,不符合C++标准的实际规则。


内容的提问来源于stack exchange,提问作者Itachi Uchiwa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:45:07