gpt4 book ai didi

c++ - 有没有一种好方法可以确保 C++ 函数结果不被忽略?

转载 作者:可可西里 更新时间:2023-11-01 18:17:57 27 4
gpt4 key购买 nike

我最近遇到一个案例,我有一个 const 成员函数执行操作并返回结果。例如,

class Foo { ...
Foo add(Foo const & x) const;
}

但其他人无意中调用它就像它正在更新 this 对象(忽略结果):

Foo a = ...;
Foo b = ...;
a.add(b);

(此错误实际上是由不完善的重构引入的。)

有没有办法让上面的最后一行触发错误或警告?下一个最好的事情是运行时捕获,它主要由以下模板解决。但是,如计数器结果所示,它会破坏返回值优化。

template<typename T>
class MustTake {
T & obj;
bool took;
public:
MustTake(T o) : obj(o), took(false) {}
~MustTake() { if (!took) throw "not taken"; }
operator T&() { took = true; return obj;}
};

struct Counter {
int n;
Counter() : n(0) {}
Counter(Counter const & c) : n(c.n+1) {}
~Counter() {}
};

Counter zero1() {
return Counter();
}

MustTake<Counter> zero2() {
return Counter();
}

int main() {
Counter c1 = zero1();
printf("%d\n",c1.n); // prints 0
Counter c2 = zero2();
printf("%d\n",c2.n); // prints 1
zero1(); // result ignored
zero2(); // throws
return 0;
}

我想我可以通过使用宏来改善效率低下的情况,这样 MustTake<> 就只能进行调试,而发布时不会执行任何操作。

我正在寻找编译时解决方案。如果做不到这一点,我正在寻找最佳的运行时解决方案。

最佳答案

这就是 GCC 和 Clang 中 ( documentation ) 的函数属性,但它不可移植到例如MSVC。

class Foo { ...
__attribute__((warn_unused_result))
Foo add(Foo const & x) const;
}

文档说它用于 realloc 例如, 但它没有出现在我系统上的任何其他标准函数上。

您可能还对使用 Clang 静态分析器感兴趣,它可以跟踪跨函数调用的数据流,并可以为您提供更好的警告。

关于c++ - 有没有一种好方法可以确保 C++ 函数结果不被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6433336/

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