在下面的代码中,我无法理解是否将alg_marg
和true_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
声明为引用吗?
答案 0 :(得分:3)
alg.belief(fg.var(i))
这将返回一个Factor
对象,该对象是您立即使用的p()
临时对象,返回TProb
。临时将被销毁并且(假设p
返回的任何内容Factor
成员)也将消失。给你一个悬空参考。