有没有办法强制执行/建议"声明没有效果"用户定义类型的警告

时间:2017-09-07 15:41:00

标签: c++ language-lawyer compiler-warnings

此问题来自此c++ how to replace a string in an array for another string

所以如果我们有这个代码:

void foo( int i )
{
   i == 123;
}

我们得到编译器警告(来自gcc v.5.0.1 -Wall):

  

警告:声明无效[-Wunused-value]

这是好的,有用的和有益的。

但如果我们对std::string执行相同操作,则编译器是安静的:

void foo( std::string str )
{
    str == "foobar";
}

据我所知,可以忽略bool std::string::operator==()的结果(与任何其他功能一样)。但有没有办法(或任何计划创建一个)使编译器也为用户定义的类型生成警告,因此嵌入类型和用户定义的行为更接近?

PS我明白让编译器自动执行此操作并不简单。但实际上我想到的是一种方法来告诉编译器"当忽略此函数的结果时生成警告"除非有副作用。可能吗?这种方式有不良副作用吗?

1 个答案:

答案 0 :(得分:3)

这里的问题不仅是operator==可能产生副作用,而且将"foobar"转换为std::string的转换运算符/构造函数很可能会产生副作用,例如内存分配

以下是插图:

struct mystring {
    mystring(const char* str) {
        cout << "Constructed '" << str << "'" << endl;
    }
    bool operator==(const mystring& other) const {
        cout << "Compared" << endl;
        return false;
    }
};

当你这样做时

mystring a("hello");
a == "world";

程序prints

Constructed 'hello'
Constructed 'world'
Compared

据我所知,没有标准技术可以说服编译器报告这些情况。然而,存在非标准技术,例如, __attribute__ ((warn_unused_result))(感谢Fire Lancer)或Q&A on __attribute__((const)) and __attribute__((pure))让编译器取消这些调用。

以下是modified demo,其中__attribute__((warn_unused_result))用于生成警告(我添加了语法错误,以便在ideone上显示警告)。