此问题来自此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我明白让编译器自动执行此操作并不简单。但实际上我想到的是一种方法来告诉编译器"当忽略此函数的结果时生成警告"除非有副作用。可能吗?这种方式有不良副作用吗?
答案 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上显示警告)。