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

2024-02-04

我原以为这将是一个通过谷歌解决的简单问题,但我似乎找不到明确的(甚至是推测性的)答案:

使用比较器语句时,隐式转换按什么顺序发生?

int i = -1;
size_t t = 1;

bool result = i < t;

这是否相当于:

bool result = i < int(t);    // equals true

or:

bool result = size_t(i) < t;    // equals false

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

  1. “更简单”的参数总是转换为“更复杂”的参数(即 size_t->int),或者
  2. 第一个(或第二个)参数始终转换为第二个(或第一个)参数的类型,或者
  3. 内置基元(例如 size_t 和 ints)具有特定的比较器运算符,用于指定具体情况的转换。

这三个看起来都是合理的,尽管第二个会产生与大多数人直观期望的显着不同的行为。

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

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


这些规则相当复杂,并且取决于实施。 然而,基本上:

  1. 两种类型都被“提升”。这意味着任何事情 小于int被提升为int。 (在不太可能的情况下 那size_t小于int, 将会提升为 一个签名的int,并失去其无符号性。)

  2. 如果其中一种类型可以包含该类型的所有值 other,其他的都转换成这个类型。

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

For int and size_t(要求未签名),这 意味着除非size_t小于int, the int将要 被转换为size_t.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 如何将参数隐式转换为比较器,例如 <? 的相关文章

随机推荐