2016-05-02 11 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_typestd::size_tのものがあるがある場合は、

20.9.9デフォルトのアロケータ
typedef size_t size_type;

そして、我々はstd::size_tは常に符号なし整数型であることを知って、

C++標準
5.3.3のsizeof
sizeofとsizeofの結果は... std::size_tの定数です。
[注:のstd :: size_tのは、標準ヘッダで定義されて<cstddef>

8.2タイプ
内容は次のように変更して、標準のCライブラリヘッダ<stddef.h>と同じである。


C標準
の6.5.3.4はsizeofと_Alignofオペレータ
両方の演算子の結果の値は実装定義である、
そのタイプ(符号なし整数型) <stddef.h>(および他のヘッダ)に定義され、size_tあります。

size_typeと定義すると、どうすれば-1になりますか?

+1

'-1 'は暗黙的に' size_type'に変換されていますか? –

+2

リンクしたページを実際に読んだことがありますか?最初の文章では「これはtype_type_typeで表現可能な最大値に等しい特別な値です」と記載されています。 – user463035818

答えて

4

C++仕様では、符号付きの型を符号なしの型に変換する必要があります。 § 4。宛先タイプが符号なしの場合、結果の値は、nは、符号なしを表すために使用されるビットの数であるソース 整数(モジュロ2 Nと合同以上の符号なし整数である

こと7/2状態タイプ)

つまり-1場合でもsize_typeが符号なしsize_typeに変換することができ、その数に1を加算する与える必要があるため、結果は最大可能size_typeに等しくなることC++仕様保証戻る0

+0

つまり、2バイトの場合は0xFFFF – DarthRubik

2

この定義では、符号なし整数がモジュラ算術に続き、-1が与えられた型の符号なし整数の最大値に変換されるという事実を使用しています。

+0

よろしいですか。私は、負の数を持つ符号なし積分を構築し、そのようなアンダーフローに依存するとは思わなかった。 –

関連する問題