gpt4 book ai didi

c++ - 有没有办法为用户定义的类型强制/建议 "statement has no effect"警告

转载 作者:行者123 更新时间:2023-11-30 02:23:35 25 4
gpt4 key购买 nike

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

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

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

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

warning: statement has no effect [-Wunused-value]

这很好,有用且信息丰富。

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

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

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

PS 我知道让编译器自动执行此操作并不简单。但实际上我想到的是一种告诉编译器“忽略此函数的结果时生成警告”的方法,除了是否有副作用。是否可以?这种方式有不良副作用吗?

最佳答案

这里的问题不仅在于 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 上可见)。

关于c++ - 有没有办法为用户定义的类型强制/建议 "statement has no effect"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46100411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com