2016-05-02 19 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

好的,有道理。我不認爲你可以用負數構造無符號整數並依賴這樣的下溢。 –

相關問題