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

cppreference中add_rvalue_reference实现里int参数(0)的作用是什么?

为什么add_rvalue_reference的实现要用int参数而非无参数?
  • 核心是靠函数重载的优先级差异实现SFINAE逻辑,让编译器能正确选择对应重载版本:

    • 调用时传0(int类型),会优先匹配接受int参数的重载,尝试生成T&&类型。
    • 但如果T是不能被右值引用修饰的类型(比如void、固定大小数组int[3]),T&&无效,此时这个重载会被SFINAE规则排除,编译器自动 fallback 到接受...(可变参数)的重载,返回原类型T。
  • 要是改成无参数的重载直接会出问题:

    • 两个无参数的模板重载签名完全一致,编译器无法区分,会报歧义错误。
    • 加个int参数后,精确匹配的优先级远高于可变参数匹配,只有当精确匹配的重载因类型不合法被排除时,才会选可变参数版本,完美实现了“能加右值引用就加,不行就返回原类型”的逻辑。
  • 举两个实际例子:

    • 当T = void时,void&&不合法,int参数的重载被排除,最终add_rvalue_reference<void>::type就是void,符合标准要求。
    • 当T = int时,int&&合法,优先选int参数的重载,add_rvalue_reference<int>::type就是int&&。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:15:33