有没有一种好的方法来确保不忽略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 <>仅是调试操作,没有操作可供发布。 我正在寻找编译时解决方案。如果失败,我正在寻找最佳的运行时解决方案。     
已邀请:
        这就是GCC和Clang中用于(文档)的功能属性,但是不能移植到例如MSVC。
class Foo { ...
    __attribute__((warn_unused_result))
    Foo add(Foo const & x) const;
}
该文档说它例如用在ѭ5上,但是它没有出现在我的系统上的任何其他标准函数上。 您可能还对使用Clang静态分析器感兴趣,该静态分析器可跟踪函数调用之间的数据流并向您提供更好的警告。     
        对于Microsoft VC ++,有“ѭ6”注释:http://msdn.microsoft.com/zh-cn/library/ms235402(v=VS.100).aspx     
        如果重要的是函数的调用者不要忽略返回值,则可以使用模板
dont_ignore
,如下所示 之前:
int add( int x, int y )
{
    return x + y;
}
后:
dont_ignore<int> add( int x, int y )
{
    return x + y;
}
当函数的调用者不使用返回值时,将引发异常。
dont_ignore
的定义:
template<class T>
struct dont_ignore
{
    const T     v;
    bool        used;

    dont_ignore( const T& v )
        :  v( v ), used( false )
    {}

    ~dont_ignore()
    {
        if ( !used )
            throw std::runtime_error( \"return value not used\" );
    }

    operator T()
    {
        used = true;
        return v;
    }
};
    

要回复问题请先登录注册