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

C++转换函数模板的模板实参推导疑问:为何能推导T=int?

转换函数模板实参推导疑问

先看这段代码:

struct S
{
    template <class T>
    operator const T()
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        return T();
    }
} s;

int&& res = s; 

根据[temp.deduct.conv]/1:

模板实参推导通过比较转换函数模板的返回类型(记为P)与转换所需的结果类型(记为A)进行[...]

以及[temp.deduct.conv]/4(重点强调):

若A是cv限定类型,推导时忽略A类型的顶层cv限定符。若A是引用类型,则使用A所引用的类型进行推导。

还有[temp.deduct.conv]/5(重点强调):

通常,推导过程会尝试找到使推导所得的A与原A完全相同的模板实参值。但存在四种允许差异的情况:

  • (5.1) 若原A是引用类型,A可以比推导所得的A(即引用所指的类型)具有更多cv限定符。
  • [...]

我原本预期程序会非法,理由是以下两种情况之一:

  • P的类型为const T,A的类型为int&&。由于A是引用类型,P不做调整,但A会根据[temp.deduct.conv]/4调整为int。此时推导失败,且[temp.deduct.conv]/5中的(5.1)也不适用,程序应为非法。
  • 将int&&类型的引用绑定到const T类型的值会丢弃限定符,引用初始化无效,程序应为非法。

但实际结果却显示推导得到的T为int,程序能正常运行。请问我忽略或混淆了哪个知识点?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:48:45