为什么编译器不能用文字确定 std::max 的模板?
Why can't compiler determine template of std::max with literal?
既不是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_t
与0
进行比较,两个编译器都不会抱怨警告,就像我将size_t
与int
进行比较一样。然后我推断编译器可以弄清楚将0
与size_t
进行比较是有意义的,那么是什么阻止编译器弄清楚使用哪个max
呢?
>std::max
只有一个模板参数,用于这两个参数。当您在没有显式指定该参数的情况下调用该函数时,它会尝试从两个参数中推导它,最终一个推导得到size_t
,另一个推int
(因为这些是两个参数的类型),并且不知道你想要哪一个。
不过,很确定在您切断的地方之后 Clang 错误消息的部分正是这样说的。
litwral 的类型为 int
。模板匹配(T、T)不会进行转化。
相关文章:
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 关于 std::min, std::max 中的比较运算符的混淆
- std::max() 函数与定点实现的比较中的问题
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- 在枚举类型上使用std::max是不是一种糟糕的做法
- 如何在 C++11 中将 std::max 与自定义比较器一起使用?
- C++是否在 std::min 和 std::max 下标准化 std::optional 的行为?
- 编译器无法推断 std::max 的重载
- std::max在包含<algorithm>后无法解析
- 为什么 c++ 编译器在对两种不同类型的数值变量使用"std::max()"函数时会出现错误
- 执行 std::min(0.0, 1.0) 和 std::max(0.0, 1.0) 会产生未定义的行为
- 自动变量可存储函数指针到std :: max
- 当我尝试编译程序时,我遇到了一堆错误,例如:'std::max':找不到匹配的重载函数
- 删除 max 并添加新元素 c++ std::make_heap 时进行单个'Heapify'调用
- std :: max带有动态数组
- 如何编写一个 boost::spirit::qi 解析器来解析从 0 到 std::numeric_limits:<int>:max() 的整数范围?
- std :: max,但用于模板参数
- 如果std::max()通过引用返回(这是必须的),这是否会导致悬空引用
- std::max with lambda and auto