2016-05-02 18 views
0

如果std::stringstd::size_type是默认分配的,如果npos为-1,size_type如何成为无符号整数?

21.3.1类模板basic_string的
typedef typename allocator_traits<Allocator>::size_type size_type;

而且std::size_type默认分配是,std::size_t

20.9.9默认分配
typedef size_t size_type;

而我们知道,std::size_t始终是一个无符号整型,

C++标准
5.3.3的sizeof
的sizeof和sizeof ...的结果是std::size_t类型的常量。
[注:标准::为size_t在标准报头中定义<cstddef>

8.2类型
的内容是一样的标准C库头<stddef.h>,有以下变化:


C标准
个6.5.3.4所述的sizeof和_Alignof运营
两个操作的结果的值是实现定义,
及其类型(无符号整型)是size_t,在 <stddef.h>(和其它标题)所定义。

std::basic_string::npos(定义为size_type)为-1?

+1

它的'-1'隐式转换为'size_type'? –

+2

您是否真正阅读过您链接的页面?第一句话说:“这是一个特殊值,等于size_type类型可表示的最大值。” – user463035818

回答

4

C++规范要求签名类型可以转换为无符号类型。 § 4。7/2指出

如果目标类型是无符号,所得到的值是至少无符号整数全等到源 整数(模2 Ñ其中n是用来表示无符号的比特数型)

这意味着,C++规范保证-1可以被转换为一个size_type即使size_type是无符号的,并且因为将1加到该号码需要,得到的结果将是等于最大可能size_type返回0.

+0

换句话说,如果它是2个字节,它将是0xFFFF – DarthRubik

2

该定义使用无符号整数遵循模运算的事实,并且-1将转换为给定类型的最大无符号整数。

+0

好的,有道理。我不认为你可以用负数构造无符号整数并依赖这样的下溢。 –

相关问题