【问题标题】:How can I tell gcc to warn me of strings being assigned an integer value?我如何告诉 gcc 警告我字符串被分配了一个整数值?
【发布时间】:2011-10-27 15:18:17
【问题描述】:

这是我的测试用例(注意 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 ?

【问题讨论】:

  • @0A0D:这里没有区别。
  • 对不起,但是不将整数分配给字符串呢?这真的不是你能做的最邪恶的事情,也不能阻止在 C++ 中做。
  • @Christian Rau - 我将其添加到测试用例中,因为我在主项目中更改了变量的类型,并且在编译代码时感到非常惊讶(是的,使用编译器为变量添加书签是有罪的用法)

标签: c++ string stl


【解决方案1】:

原因是存在以下重载:

string &operator=(char)

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

我认为-Wconversion GCC 标志应该可以解决这个问题,但它似乎不起作用,至少在 GCC 4.1.2 中。

【讨论】:

  • +1 但如果你能回答关于检测它的问题,我也会很好奇。
  • 实际上,我认为您可以实现该类,使其成为编译时错误。只需提供一个无法编译的模板operator=。但这不符合标准;一个法律程序可以做类似long x = 'x'; someString = x;的事情。
  • 使用 -Wconversion,我得到“警告:从‘int’转换为‘char’可能会改变它的值”。我将尝试这个并通过显式转换来解决它报告的任何其他问题。
  • 我可以通过实现自己的字符串 &operator=(char) 来覆盖重载吗?
  • @user1016736 不,因为它必须是成员函数,这需要您更改实现的 std::string
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    由于以下重载而编译:

    string& operator=(char)
    

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

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

    【讨论】:

    • +1 因为您实际上回答了这个问题:-)。不仅仅是为什么它不抱怨,而是如何得到投诉。 (这也会引发其他投诉,但大多数投诉也是合理的。)
    • 很好 - 添加 o -Wconversion 和 -Werror 也迫使我检查其他一些作业!
    • @user1016736:我认为启用所有警告标志是一个好习惯。我几乎总是使用-Wall,但不幸的是,它不包含-Wconversion,所以需要手动包含它。
    • 我已经到处都有 -Wall - 我现在也在到处添加 -Wconversion。谢谢。
    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多