在该计划中,它有:
EnergyFunctional* ef;
ef->insertFrame(fh, &Hcalib);
该功能定义如下:
EFFrame* EnergyFunctional::insertFrame(FrameHessian* fh, CalibHessian* Hcalib)
{
EFFrame* eff = new EFFrame(fh);
eff->idx = frames.size();
frames.push_back(eff);
nFrames++;
fh->efFrame = eff;
assert(HM.cols() == 8*nFrames+CPARS-8); /// CPARS = 4
bM.conservativeResize(8*nFrames+CPARS);
HM.conservativeResize(8*nFrames+CPARS,8*nFrames+CPARS);
bM.tail<8>().setZero();
HM.rightCols<8>().setZero();
HM.bottomRows<8>().setZero();
EFIndicesValid = false;
EFAdjointsValid=false;
EFDeltaValid=false;
setAdjointsF(Hcalib);
makeIDX();
for(EFFrame* fh2 : frames)
{
connectivityMap[(((uint64_t)eff->frameID) << 32) + ((uint64_t)fh2->frameID)] = Eigen::Vector2i(0,0); /// move left 32 bits
if(fh2 != eff)
connectivityMap[(((uint64_t)fh2->frameID) << 32) + ((uint64_t)eff->frameID)] = Eigen::Vector2i(0,0); /// index is totally 64 bits, front 32 bits for each frame, rear 32 bits for current frame
}
return eff;
}
似乎返回类型应该是无效的,以便它可以与最后一句话一致......
我还检查了是否有其他同名&#34; inserFrame&#34;功能,但没有。
这个程序可以成功编译,但为什么没有问题呢?
答案 0 :(得分:3)
函数指定的返回类型是EFFrame*
,它是指向EFFrame
对象的指针。函数返回的值是eff
,它也是EFFrame*
类型指针。所以不应该有任何混淆。
如果您没有返回值,则只能在函数声明中使用void
返回类型。但是,如最后一行所示,此函数显然正在尝试返回指向EFFrame
对象的指针。
但是,即使在具有明确定义的返回类型的函数中,也可能没有必要使用该值。因此,仅调用函数并不将返回值存储到变量中在技术上是合法的。因此,即使ef->insertFrame(fh, &Hcalib);
正在调用函数并返回EFFrame*
指针,它也不会被存储。