这是我的测试用例(请注意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?
答案 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
将警告视为错误。