web-dev-qa-db-ja.com

intではなくstring :: size_type

const std::string::size_type cols = greeting.size() + pad * 2 + 2;

なぜ string::size_typeintは動作するはずです!それは数字を保持します!!!

57

ショートは数字も保持します。署名された文字も同様です。

しかし、これらのタイプはいずれも、any文字列のサイズを表すのに十分な大きさを保証されていません。

string::size_typeはそれだけを保証します。文字列の大きさに関係なく、文字列のサイズを表すのに十分な大きさの型です。

これが必要な理由の簡単な例については、64ビットプラットフォームを検討してください。通常、これらの整数はまだ32ビットですが、2 ^ 32バイトをはるかに超えるメモリがあります。

(符号付き)intが使用された場合、2 ^ 31文字を超える文字列を作成できなくなります。ただし、これらのプラットフォームではsize_typeは64ビット値になるため、問題なく大きな文字列を表すことができます。

98
jalf

あなたが与えた例、

const std::string::size_type cols = greeting.size() + pad * 2 + 2;

KoenigによるAccelerated C++ からのものです。彼はまた、この直後に彼が選んだ理由を述べています:

Std :: stringタイプは、文字列の文字数を保持するための適切なタイプの名前であるsize_typeを定義します。文字列のサイズを格納するためにローカル変数が必要なときはいつでも、その変数の型としてstd :: string :: size_typeを使用する必要があります。

Colsにstd :: string :: size_typeのタイプを指定した理由は、colsがグリーティングの文字数を含むことができるようにするためです。 colsの型はintであると単純に言うことができますが、実際にはそうすることでおそらく動作します。ただし、colsの値はプログラムへの入力のサイズに依存し、入力の長さを制御することはできません。誰かがプログラムに長い文字列を与えてintがその長さを収めるには不十分である可能性が考えられます。

23
mihai

ネストされたsize_type typedefは、STL互換コンテナの要件です(_std::stringがたまたま)ので、汎用コードはサイズを表す正しい整数型を選択できます。

アプリケーションコードで使用する意味はありません。size_tは完全に問題ありません(intは署名されていないため、署名されていないため、署名された/署名されていない比較の警告が表示されます)。

7