为什么不能在 c++ 中比较 int 和 size_t



问题是,如果我在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。另一个是CCD_ 2。这是可以的,有一些规则可以确定哪个实际类型用于比较(int值将类型转换为size_t,然后由<运算符进行比较。

max(3, v.size());

std::max的定义在功能上要求的两个参数都是相同的类型。他们不是。因此出现了编译错误。

既然你理解了原因,试着重读下面的错误消息,看看你现在是否理解了编译器告诉你的确切信息:

推导出参数'_Tp'('in'与'unsigned long'(max(const_Tp&,const_Tp&amp;(的冲突类型;

正如您在这里看到的,编译器正在非常努力地消化具有两个参数的函数,这两个参数都是同一类型:const _Tp &。这就是max()的定义:它的两个参数都是相同的类型。

好吧,糟糕的编译器看到其中一个参数是int,另一个是size_t(又称"无符号长"(,就放弃了。

最新更新