有没有一种好的方法来确保不忽略C ++函数的结果?
|
最近,我遇到了一种情况,我有一个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 <>仅是调试操作,没有操作可供发布。
我正在寻找编译时解决方案。如果失败,我正在寻找最佳的运行时解决方案。
没有找到相关结果
已邀请:
3 个回复
钨蜡唤喉晤
该文档说它例如用在ѭ5上,但是它没有出现在我的系统上的任何其他标准函数上。 您可能还对使用Clang静态分析器感兴趣,该静态分析器可跟踪函数调用之间的数据流并向您提供更好的警告。
才改隘瘁
佩疵瓦
,如下所示 之前:
后:
当函数的调用者不使用返回值时,将引发异常。
的定义: