我原以为这是一个很容易通过谷歌解决的问题,但我似乎无法找到明确的(甚至是推测性的)答案:
使用比较器语句时,隐式转换的顺序是什么?
int i = -1;
size_t t = 1;
bool result = i < t;
这相当于:
bool result = i < int(t); // equals true
或:
bool result = size_t(i) < t; // equals false
这是问题的简单部分 - 第二部分是“一般规则是什么”,因为它可能是:
这三个看起来都是合理的,尽管第二个会产生与大多数人直觉所期望的显着不同的行为。
当你将int与size_t进行比较时,VC ++编译器似乎认为它值得一个3级警告 - 然而当你从返回size_t的函数返回负数时它只会给出4级警告(这导致一个数字刚刚超过返回的最大整数的一半。)
为了摆脱所有4级警告,我现在无论如何都明确地投了一切,但我想知道“真相”。这必须在某处定义......
答案 0 :(得分:10)
规则相当复杂,取决于实施。 但基本上:
两种类型都是“促销”。这意味着什么
小于int
的人被提升为int
。 (在不太可能的情况下
size_t
小于int
,它将被提升为
已签名的int
,并且无效。
如果其中一个类型可以包含所有值 另外,另一个转换为这种类型。
如果其中一个类型是未签名的,另一个是签名的,和 它们具有相同的大小,签名转换为 无符号的。
对于int
和size_t
(必须是无符号的),这个
表示除非size_t
小于int
,否则int
将会{。}}
转换为size_t
。
答案 1 :(得分:4)
$ 18.2 / 6-类型size_t是一个实现定义的无符号整数 类型足够大,可以包含任何对象的字节大小。
$ 5.9 - 否则,如果具有无符号整数类型的操作数具有 等级大于或等于另一个类型的等级 操作数,带有符号整数类型的操作数应转换为 具有无符号整数类型的操作数的类型。对于第一个 part,bool在指定的转换之前被提升为int 按照C ++标准。
所以,这意味着&#39;我&#39;转换为&#39; size_t&#39;的类型(假设size_t的类型为&#39; unsigned int&#39;或更高)。那么结果类型为&#39; unsigned int&#39;被转换为&#39; bool&#39; (这是result
)的类型。
请注意,标准指定signed int
和unsigned int
的排名相同。
有关转换/促销的确切规则,请参阅C ++标准的第4节和第5节。