C ++如何隐式地将参数转换为比较器,例如<! - ? - >

时间:2013-01-30 12:21:01

标签: c++ casting comparator implicit-conversion

我原以为这是一个很容易通过谷歌解决的问题,但我似乎无法找到明确的(甚至是推测性的)答案:

使用比较器语句时,隐式转换的顺序是什么?

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

这是问题的简单部分 - 第二部分是“一般规则是什么”,因为它可能是:

  1. 'simpler'参数总是转换为'更复杂'的参数(即size_t-&gt; int),或
  2. 第一个(或第二个)参数始终转换为第二个(或第一个)参数的类型,或
  3. 内置的原语(如size_t和ints)具有特定的比较运算符,用于逐个指定转换。
  4. 这三个看起来都是合理的,尽管第二个会产生与大多数人直觉所期望的显着不同的行为。

    当你将int与size_t进行比较时,VC ++编译器似乎认为它值得一个3级警告 - 然而当你从返回size_t的函数返回负数时它只会给出4级警告(这导致一个数字刚刚超过返回的最大整数的一半。)

    为了摆脱所有4级警告,我现在无论如何都明确地投了一切,但我想知道“真相”。这必须在某处定义......

2 个答案:

答案 0 :(得分:10)

规则相当复杂,取决于实施。 但基本上:

  1. 两种类型都是“促销”。这意味着什么 小于int的人被提升为int。 (在不太可能的情况下 size_t小于int,它将被提升为 已签名的int,并且无效。

  2. 如果其中一个类型可以包含所有值 另外,另一个转换为这种类型。

  3. 如果其中一个类型是未签名的,另一个是签名的,和 它们具有相同的大小,签名转换为 无符号的。

  4. 对于intsize_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 intunsigned int的排名相同。

有关转换/促销的确切规则,请参阅C ++标准的第4节和第5节。