[英]Why can't compare int and size_t in c++
问题是,如果我在 for 循环中比较 int 和 size_t 它工作正常。
vector<int> v;
for (int i = 0; i < v.size(); ++i)
但是,如果我这样做,它不起作用:
vector<int> v;
int max_num = max(3, v.size());
Line 13: Char 24: error: no matching function for call to 'max'
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/algorithmfwd.h:370:5: note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('int' vs. 'unsigned long')
max(const _Tp&, const _Tp&);
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_algo.h:3462:5: note: candidate template ignored: could not match 'initializer_list<type-parameter-0-0>' against 'int'
max(initializer_list<_Tp> __l, _Compare __comp)
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_algo.h:3456:5: note: candidate function template not viable: requires single argument '__l', but 2 arguments were provided
max(initializer_list<_Tp> __l)
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/algorithmfwd.h:375:5: note: candidate function template not viable: requires 3 arguments, but 2 were provided
max(const _Tp&, const _Tp&, _Compare);
^
1 error generated.
在最坏的情况下,我必须将 size_t 转换为 int 才能使其工作。
为什么在 for 循环中我不需要这样做? 只是好奇。
在 C++ 中,当二元运算符的类型不同时,有各种(复杂的)规则来控制二元运算符使用的实际类型:
i < v.size()
其中之一是int
。 另一个是size_t
。 没关系,有一些规则可以确定用于比较的实际类型( int
值被类型转换为size_t
,然后<
运算符进行比较。
max(3, v.size());
std::max
的定义在功能上要求它的两个参数是相同的类型。 他们不是。 因此编译错误。
现在您了解了原因,请尝试重新阅读以下错误消息,看看您现在是否理解编译器告诉您的确切信息:
推断参数“_Tp”的冲突类型(“int”与“unsigned long”) max(const _Tp&, const _Tp&);
正如您在此处看到的,编译器正在努力消化带有两个参数的 function,这两个参数的类型相同: const _Tp &
。 这就是max()
的定义:它的两个参数都是相同的类型。
好吧,可怜的编译器看到这些参数之一是int
,另一个是size_t
(又名“unsigned long”)并放弃了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.