string :: size_type而不是int

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

为什么string::size_typeint应该工作! 它拥有数字!

简短也包含数字。 正如一个签名字符。

但是,这些types中的任何一个都不能保证足以表示任何string的大小。

string::size_type保证了这一点。 它是一个足够大的types来表示一个string的大小,不pipestring有多大。

为了说明为什么这是必要的,请考虑64位平台。 一个int通常仍然是32位,但是你有2 ^ 32个字节的内存。

所以如果使用(signed)int,你将不能创build大于2 ^ 31个字符的string。 size_type在这些平台上将是一个64位的值,所以它可以代表更大的string而不会有问题。

你给出的例子,

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

来自Koenig的Accelerated C ++ 。 他还说明了之后他select的理由,即:

std :: stringtypes将size_type定义为用于保存string中字符数的适当types的名称。 每当我们需要一个局部variables来包含一个string的大小时,我们应该使用std :: string :: size_type作为这个variables的types。

我们给cols一个std :: string :: size_typetypes的原因是为了确保cols能够包含问候语中的字符数,不pipe这个数字有多大。 我们可以简单地说,cols有inttypes,事实上,这样做可能会起作用。 然而,cols的价值取决于我们项目的投入规模,我们无法控制投入的时间。 可以想象,有人可能会给我们的程序一个string很长的时间以至于int不足以包含它的长度。

嵌套的size_type typedef是STL兼容容器( std::string恰好是)的要求,因此通用代码可以select正确的整数types来表示大小。

在应用程序代码中使用它没有意义, size_t是完全正确的( int不是,因为它已经签名,并且会得到签名/未签名的比较警告)。