考虑以下代码:
unsigned short us = 0;
int i = 0;
auto sum = us + i;
< p > < code > sum 的类型是否是实现定义的?我阅读C++11标准后得出答案是肯定的:
- 5.7 / 1 表示将应用通常的算术转换。
- 4.13 / 1 子弹2和3表示 int 的等级大于 unsigned short 的等级。
- 5/9 子弹5子弹4 表示如果 int 可以表示 unsigned short 中的所有值,则 unsigned short 转换为 int,并且
sum
的类型为 int。 - 5/9 子弹5子弹5 表示如果 int 无法表示 unsigned short 中的所有值,则两个操作数都将转换为 unsigned int,并且
sum
的类型为 unsigned int。
如果上述分析合理,这意味着使用 auto
来声明使用内置类型进行算术表达式初始化的变量可能会导致实现定义的结果。我猜很多程序员会对上面的 sum
类型不完全由标准决定感到惊讶。
我的推理合理吗?
sum
而言,它的类型是std::common_type<unsigned short, int>::type
,如果有价值的话... - Kerrek SBcommon_type
是true ? a : b
的类型,我认为它需要调用通常的算术转换。 - Kerrek SBauto
无关。表达式us + i
具有实现特定的类型。您应该避免在算术运算中混合有符号和无符号类型,而不是避免使用auto
。 - nosid