【发布时间】:2020-12-14 19:23:56
【问题描述】:
考虑以下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<T&> 匹配的S<int&>,并接受调用。
clang 不考虑转换运算符,无法将 T& 与 int&& 匹配,并拒绝调用。
那么语言所说的应该在这里发生什么?
【问题讨论】:
-
我很困惑,请忽略。模板参数推导失败,重载解析失败,没有其他考虑,至少我认为是这样。
-
@PasserBy 是的,扣减失败,但仅在一种情况下,而不是另一种情况。我想知道哪一个是正确的,如果有的话。
-
我的意思是 gcc 是错误的。
-
@PasserBy 好的,谢谢。如果您能找到错误报告,那就太好了。如果您知道 为什么 gcc 是错误的,那么答案也会很不错。
-
This 可以提供帮助。我猜clang是正确的...
标签: c++ templates language-lawyer template-argument-deduction