无符号短整型和整型的类型实现是否是定义好的?

8

考虑以下代码:

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 类型不完全由标准决定感到惊讶。

我的推理合理吗?


1
嗯,当您查阅平台的类型特征后,它就有点像是“完全确定”了。 - Kerrek SB
2
换句话说,如果它完全由标准决定,那么你可以只需放弃关于算术转换的整个部分,并用一个简单的矩阵替换它,告诉你实际结果类型。就你的sum而言,它的类型是std::common_type<unsigned short, int>::type,如果有价值的话... - Kerrek SB
1
@KnowItAllWannabe:我认为是这样的... common_typetrue ? a : b 的类型,我认为它需要调用通常的算术转换。 - Kerrek SB
2
类型是特定于实现的,但不是实现定义的。实现定义意味着实现必须记录它所做的事情。 - Pete Becker
2
这与 auto 无关。表达式 us + i 具有实现特定的类型。您应该避免在算术运算中混合有符号和无符号类型,而不是避免使用 auto - nosid
显示剩余6条评论
1个回答

0

类型是实现特定的,但不是实现定义的。实现定义意味着实现必须记录它所做的事情。


我接受这个答案,但我鼓励读者查看原问题的评论以获取更多信息。 - KnowItAllWannabe
标准对于实现定义行为的规范相当模糊,无法确定所需文档的形式和具体要求。符合标准要求并指定了“int”和“unsigned short”的范围的实现将在这样做时表明涉及这些类型的操作必须如何执行。 - supercat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接