考虑以下 code :
template<typename>
struct S
{
operator S<int&>();
};
template<typename T>
void f(S<T&>);
int main()
{
f(S<int&&>{}); // gcc ok
// clang error
}
gcc 在临时参数上使用转换运算符,返回 S<int&>
与 S<T&>
匹配,并接听电话。clang 不考虑转换运算符,无法匹配
T&
反对 int&&
, 并拒接来电。那么语言说这里应该发生什么?
最佳答案
GCC在这里肯定是错误的:T&
和 T&&
是 [temp.deduct.type]/8 中的不同行,因此不兼容。为什么这样做尚不清楚。在另一个方向犯错会更有意义:如果参数被声明为 S<T&&>
并且参数的类型是 S<int&>
,至少会有一个 T
(即, int&
)使得(由于引用折叠)参数和参数类型相同。 (如果说涉及到通用引用,也很容易犯错误。)
关于c++ - 函数模板参数推导是否应该考虑转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63590084/