我正在阅读Andrew Koenig和Barbara E.Moo的《Accelerated C++》一书,对第2章中的主要示例有些疑问。 以下是代码摘要,并且使用g ++编译时没有警告/错误:
#include <string>
using std::string;
int main()
{
const string greeting = "Hello, world!";
// OK
const int pad = 1;
// KO
// int pad = 1;
// OK
// unsigned int pad = 1;
const string::size_type cols = greeting.size() + 2 + pad * 2;
string::size_type c = 0;
if (c == 1 + pad)
{;}
return 0;
}
但是,如果我将const int pad = 1;
替换为int pad = 1;
,g ++编译器会返回一个警告:
warning: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
if (c == 1 + pad)
如果我用
unsigned int pad = 1;
替换const int pad = 1;
,g++编译器将不会返回警告。我理解为什么g++会返回警告,但我对以下三点不确定:
- 使用
unsigned int
与std::string::size_type
进行比较是否安全?编译器在这种情况下不会返回警告,但我不确定是否安全。
- 为什么编译器在原始代码const int pad = 1
中没有发出警告。编译器是否自动将变量pad
转换为unsigned int
?
- 我还可以用string::size_type pad = 1;
替换const int pad = 1;
,但是我认为变量pad
的含义与字符串大小没有真正联系。即使如此,在这种情况下,这是否是避免比较中有不同类型的最佳方法?
basic_string::size_type
=>typedef typename allocator_type::size_type size_type;
=> 一种无符号整数类型,可表示字符串中的元素和索引数量。(https://msdn.microsoft.com/library/5ddehwe8.aspx)。因此,使用无符号整数可能是一个不错的做法。 - Fefuxif ( (int)c == pad + 1 )
- i486