【发布时间】:2020-09-08 13:38:41
【问题描述】:
std::string s{ "aa" };
s.length() - 3; // == very large number
从内存中,C 的整数提升规则(关于 C++ 的 idk)产生了一个足够宽的类型以适应计算结果并支持无符号类型(用于额外的宽度)。但是3 的类型是int(对吗?)。那么为什么是unsigned 类型的结果而不是int 或long? unsigned 的宽度肯定不够足以捕捉表达式的结果!
【问题讨论】:
-
s.length()是无符号的,所以3在做减法之前被提升为无符号。无符号减法的换行定义明确。有一篇讨论论文讨论了为什么使标准库容器大小类型无符号是一个问题,并且它们都应该被签名,但是现在改变已经太迟了。 -
从 c++20 开始,std::ssize 就是为了这个目的。
标签: c++ c++11 integer-promotion