存储返回引用的函数的返回值

时间:2016-06-06 17:40:45

标签: c++

在下面的代码中,我无法理解是否将alg_margtrue_marg声明为引用,特别是为什么一个行为与另一个行为不同。

int run_test(InfAlg& alg, FactorGraph& fg, vector<Factor>& exact_marg) {
    for (size_t i = 0; i < fg.nrVars(); i++) {
        // true_marg declared as a reference
        TProb<Real>& true_marg = exact_marg[i].p();
        // alg_marg can't be declared as a reference or the code breaks later on - why?
        TProb<Real> alg_marg = alg.belief(fg.var(i)).p();
    }
}

来自文档的相关功能签名如下:

Factor dai::JTree::belief (const VarSet &vs) const virtual
const TProb<T>& p() const
TProb< >& p ()

p()的函数签名表示它返回一个引用,所以我不应该将alg_marg声明为引用吗?

1 个答案:

答案 0 :(得分:3)

alg.belief(fg.var(i))

这将返回一个Factor对象,该对象是您立即使用的p()临时对象,返回TProb。临时将被销毁并且(假设p返回的任何内容Factor成员)也将消失。给你一个悬空参考。