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
相关产品推荐
相关产品推荐

