const std::string::size_type cols = greeting.size() + pad * 2 + 2;
なぜ string::size_type
? int
は動作するはずです!それは数字を保持します!!!
ショートは数字も保持します。署名された文字も同様です。
しかし、これらのタイプはいずれも、any文字列のサイズを表すのに十分な大きさを保証されていません。
string::size_type
はそれだけを保証します。文字列の大きさに関係なく、文字列のサイズを表すのに十分な大きさの型です。
これが必要な理由の簡単な例については、64ビットプラットフォームを検討してください。通常、これらの整数はまだ32ビットですが、2 ^ 32バイトをはるかに超えるメモリがあります。
(符号付き)intが使用された場合、2 ^ 31文字を超える文字列を作成できなくなります。ただし、これらのプラットフォームではsize_typeは64ビット値になるため、問題なく大きな文字列を表すことができます。
あなたが与えた例、
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がその長さを収めるには不十分である可能性が考えられます。
ネストされたsize_type
typedefは、STL互換コンテナの要件です(_std::string
がたまたま)ので、汎用コードはサイズを表す正しい整数型を選択できます。
アプリケーションコードで使用する意味はありません。size_t
は完全に問題ありません(int
は署名されていないため、署名されていないため、署名された/署名されていない比較の警告が表示されます)。