【发布时间】:2014-11-18 14:05:18
【问题描述】:
我正在阅读标准并试图弄清楚为什么没有强制转换就无法解析这段代码。
void foo(char c) { }
// Way bigger than char
void foo(unsigned long int) { }
int main()
{
foo(123456789); // ambiguous
foo((unsigned long int) 123456789); // works
}
它是这样说的:
4.13 整数转换排名[conv.rank]
每个整数类型都定义了一个整数转换等级 如下:
——任何无符号整数类型的等级应等于 对应的有符号整数类型。
——char的秩应该等于signed char和unsigned的秩 字符。
特别是,让我的小伙伴们感到不安的是,它没有说任何无符号整数类型,只是无符号字符。我的猜测是 char 通过转换被提升为无符号类型。这是真的吗?
【问题讨论】:
-
也许 123456789U 会为你做这件事。
-
"特别是,让我的 jimmies 沙沙作响的是,它没有说任何无符号整数类型,只是无符号字符。我的猜测是 char 正在通过转换被提升为无符号类型。这是真的吗?” - 我冒着风险你误解了标准中 4.13 的重要性...
char没有被提升为unsigned...问题就像 AndreyT 所说的那样 - 123456789 是一个int它是将其截断为char或将其传递为unsigned long显然不是更好(long会同样糟糕 -unsigned在这里并不重要)。 -
尽管有这个名称,但“整数转换排名”实际上并未用于在重载解析期间对整数转换进行排名。
-
两种转换都不是安全的——一个是有符号到无符号的,另一个是较大的类型到较小的类型——那么为什么一个不安全的操作要胜过另一个呢?
-
+1 表示“我的吉米沙沙作响”
标签: c++ integer implicit-conversion unsigned-integer integer-promotion