C++ 如果GCC 4.4.7中未使用返回值,则强制调用类运算符==失败

C++ 如果GCC 4.4.7中未使用返回值,则强制调用类运算符==失败,c++,gcc,C++,Gcc,我想知道如果结果与结果无关,是否有办法将类上使用的运算符==变成编译器错误。原因是当开发人员打算使用操作符=时,需要使用操作符== 我不在乎解决方案是否是特定于GCC的,只要它在GCC4.4.7上工作。解决方案可以包括GCC特定属性、编译器实用型或C++类的源代码文件更改。对编译器选项的更改不太吸引人 见下面的例子。取消注释下面的#define DO_STRING_LITERAL_TEST行,您将看到来自编译器的有用消息: /usr/bin/g++ -MD -DDEBUG -g -ggdb -

我想知道如果结果与结果无关,是否有办法将类上使用的
运算符==
变成编译器错误。原因是当开发人员打算使用
操作符=
时,需要使用
操作符==

我不在乎解决方案是否是特定于GCC的,只要它在GCC4.4.7上工作。解决方案可以包括GCC特定属性、编译器实用型或C++类的源代码文件更改。对编译器选项的更改不太吸引人

见下面的例子。取消注释下面的
#define DO_STRING_LITERAL_TEST
行,您将看到来自编译器的有用消息:

/usr/bin/g++  -MD -DDEBUG -g -ggdb -gstabs+ -O0  -fPIC  -Wall -Werror -Wsynth -Wno-comment -Wreturn-type   main.cpp -c -o main.o
cc1plus: warnings being treated as errors
main.cpp: In function ‘int main(int, char**, char* const*)’:
main.cpp:37: error: comparison with string literal results in unspecified behaviour
注释
#define DO_STRING_LITERAL_TEST
行,然后取消注释
#define DO_STRING_CONTAINER_TEST
行。这编译得很好,我希望它在指示的行上失败:


foo==”;// 这不应该是您在代码中验证的内容。这应该是你的编译器将为你做的事情。如果需要
std::string
,则应使用
std::string
——而不是带有此ExtraequalityCheck的
mystring

我建议以下几点之一:

  • 调试您最喜欢的gcc开发人员,让他们按照
  • 只需使用clang编译代码,它确实支持该警告。然后,您可以添加
    -Werror
    ,使其成为错误。您不需要运行铿锵二进制,但是额外的正交也不会有什么坏处(只是给了您更多的理由)
  • 使用一些外部静态分析工具来验证这些东西
  • 编写单元测试
GCC允许函数上的
\u属性\u警告\u未使用的\u结果\u
。你用你们班的比较仪试过了吗


编辑:没关系。跳过了你说你的旧GCC版本仍然不支持该属性的部分。

你首先通过比较常量免费得到这个:
1=var
是编译时错误,我怀疑这是可能的,因为函数无法知道是否使用了它的返回值。也可以考虑<代码>(fo==)“/<代码>一个错误吗?@ BRANRORDRIGEZ,如果返回没有被分配给某个东西,OP希望使用<代码>=< /代码>是一个错误。如果代码未被调用,则返回一个析构函数声明的对象。如果您的开发人员使用
=
而不是
=
,则需要雇用新的开发人员。该属性可能受支持,但
-Werror=unused result
命令行选项会出错。我同意您的看法。然而,
std::string
的包装只是为了在本例中显示编译时需要捕获的内容。
cc1plus: error: -Werror=unused-result: No option -Wunused-result