我如何告诉gcc警告我字符串被赋予整数值?

时间:2011-10-27 15:18:17

标签: c++ string stl

这是我的测试用例(请注意WTF评论):

TEST(string_assignment)
{
std::string str;
std::string cheese="Cheese";
str=cheese;
CHECK_EQUAL(cheese, str);

long lval=0;
str=lval; //WTF - why does the compiler allow this ?

str="";
str.append(cheese);
CHECK_EQUAL(cheese, str);
}

我想捕获std :: string的实例,而不是另一个字符串或char *。我曾假设编译器会拒绝不兼容的类型,但它允许它。

如何判断gcc(版本4.4.3)拒绝这种愚蠢行为? ...还是有其他方法可以强制拒绝将这些不兼容的类型分配给std :: string?

3 个答案:

答案 0 :(得分:5)

原因是存在以下过载:

string &operator=(char)

编译器可以通过单个隐式转换来满足您的赋值,因此它可以编译。

我认为-Wconversion GCC标志应该处理这个问题,但它似乎不起作用,至少在GCC 4.1.2中是这样。

答案 1 :(得分:3)

因为它不能。最终,由于C兼容性:long与所有其他内置数值类型一样,隐式转换为char。所以为了禁止这个,你还必须禁止someString = someChar。哪个不会打扰我太多,但无论出于何种原因,委员会认为是必要的。

答案 2 :(得分:3)

由于以下过载而编译:

string& operator=(char)

使用g++ -Wconversion打印警告信息。

g++ -Wconversion -Werror将警告视为错误。