C++ 有没有办法执行/建议;“声明无效”;用户定义类型的警告

C++ 有没有办法执行/建议;“声明无效”;用户定义类型的警告,c++,language-lawyer,compiler-warnings,C++,Language Lawyer,Compiler Warnings,这个问题来自于此 因此,如果我们有此代码: void foo( int i ) { i == 123; } 我们得到编译器警告(来自gcc v.5.0.1-Wall): 警告:语句无效[-Wunused值] 这是好的,有帮助的和信息量大的 但是如果我们对std::string做同样的操作,编译器是安静的: void foo( std::string str ) { str == "foobar"; } 据我所知,忽略bool std::string::operator==()(

这个问题来自于此

因此,如果我们有此代码:

void foo( int i )
{
   i == 123;
}
我们得到编译器警告(来自gcc v.5.0.1-Wall):

警告:语句无效[-Wunused值]

这是好的,有帮助的和信息量大的

但是如果我们对
std::string做同样的操作,编译器是安静的:

void foo( std::string str )
{
    str == "foobar";
}
据我所知,忽略
bool std::string::operator==()
(与任何其他函数一样)的结果是可以的。但有没有一种方法(或任何创建方法)可以让编译器也为用户定义的类型生成警告,从而使嵌入类型和用户定义类型的行为更接近


PS我明白让编译器自动完成这项工作并不简单。但实际上我想到的是一种告诉编译器“忽略此函数的结果时生成警告”的方法,不管是否有副作用。可能吗?这种方法有不良的副作用吗?

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

下面是一个例子:

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

据我所知,没有标准技术可以说服编译器报告这些情况。但是,也有一些非标准技术,例如
\uuuuuu属性((warn\u unused\u result))
(谢谢),或者让编译器消除这些调用


这里有一个例子,其中
\uuu属性(warn\u unused\u result))
用于生成警告(我添加了一个语法错误以使警告在ideone上可见)。

编译器知道内置
运算符==
的完整语义
std::string::operator=
可能有副作用(尽管它不应该有副作用)。编译器必须知道该类型的目的是使其行为类似于
int
和其他值类型。作为语言扩展,一种方法是通过属性
[[valuetype]]
。但这是一个机械化的过程,有些编译器可能有功能,但没有标准。e、 g.GCC的
-Wno unused result
用于
\uuuu attribute\uuuuuuuu((warn\u unused\u result))
,尽管您还需要能够注释所需的函数。我发现了一个关于GCC的讨论,总是发出警告,但似乎感觉问题太多了。我想有些东西必须被提议作为标准语言特性,以便standardlibrary和其他主要图书馆可以添加这样的注释。实际上,我认为更简单的是,告诉编译器在忽略特定函数的结果时生成警告。
mystring a("hello");
a == "world";
Constructed 'hello'
Constructed 'world'
Compared