为什么函数的返回类型与实际句子不一致?

时间:2017-07-24 16:11:53

标签: c++ function return-type

在该计划中,它有:

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;功能,但没有。

这个程序可以成功编译,但为什么没有问题呢?

1 个答案:

答案 0 :(得分:3)

函数指定的返回类型是EFFrame*,它是指向EFFrame对象的指针。函数返回的值是eff,它也是EFFrame*类型指针。所以不应该有任何混淆。

如果您没有返回值,则只能在函数声明中使用void返回类型。但是,如最后一行所示,此函数显然正在尝试返回指向EFFrame对象的指针。

但是,即使在具有明确定义的返回类型的函数中,也可能没有必要使用该值。因此,仅调用函数并不将返回值存储到变量中在技术上是合法的。因此,即使ef->insertFrame(fh, &Hcalib);正在调用函数并返回EFFrame*指针,它也不会被存储。