既没有铿锵也没有gcc,请编译:
#include <algorithm>
int main()
{
size_t t = 1;
t = std::max(t,0);
}
给出一些风味错误:
error: no matching function for call to 'max(size_t&,int)'
... note: template argument deduction/substitution failed:
如果我明确提供模板类型,它可以工作:
#include <algorithm>
int main()
{
size_t t = 1;
t = std::max<size_t>(t,0);
}
令人困惑的是,如果我将size_t
与0
进行比较,那么编译器都不会抱怨警告,就像我将size_t
与int
进行比较一样。然后我推断编译器可以发现将0
与size_t
进行比较是有意义的,那么是什么阻止编译器找出要使用的max
?
答案 0 :(得分:5)
std::max
只有一个模板参数,用于两个参数。当你在没有明确指定那个参数的情况下调用函数时,它会尝试从两个参数中推导出它,最后用size_t
进行一次推导,int
用于另一个(因为那些是两个参数的类型)并且不知道你想要哪一个。
非常确定Clang在您切断的地方之后的错误消息部分说明了这一点。
答案 1 :(得分:0)
litwral属于int
类型。模板匹配(T,T)不会进行转换。