为什么编译器不能用文字确定 std::max 的模板?

Why can't compiler determine template of std::max with literal?

本文关键字:max std 不能 编译器 文字 为什么      更新时间:2023-10-16

既不是clang也不是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_t0进行比较,两个编译器都不会抱怨警告,就像我将size_tint进行比较一样。然后我推断编译器可以弄清楚将0size_t进行比较是有意义的,那么是什么阻止编译器弄清楚使用哪个max呢?

>std::max只有一个模板参数,用于这两个参数。当您在没有显式指定该参数的情况下调用该函数时,它会尝试从两个参数中推导它,最终一个推导得到size_t,另一个推int(因为这些是两个参数的类型),并且不知道你想要哪一个。

不过,很确定在您切断的地方之后 Clang 错误消息的部分正是这样说的。

litwral 的类型为 int 。模板匹配(T、T)不会进行转化。