从 lambda 中返回表达式时 Eigen 结果错误

问题描述 投票:0回答:1

我正在尝试在 lambda 中使用此函数的主体:

Vector3d fun(Vector3d const& point) {
    Vector3d const b{ 0., 0., 30. };
    return b + point.normalized();
}

但是当返回之前未明确评估结果时,可以使用

return (b + point.normalized()).eval();

Vector3d ret = b + point.normalized();
return ret;

对于类似 lambda 的结果是错误的

auto lamb = [](Vector3d const& point) {
    Vector3d const b{ 0., 0., 30. };
    return b + point.normalized();
    };

我不明白为什么。

文档指出,按值返回对象是可以的,我不确定是否以及如何应用此处提到的内容

我试图理解为什么在这个示例主体中,lambda 在返回之前需要显式 eval,但普通的自由函数不需要。

简短演示

长演示

c++ c++11 eigen eigen3
1个回答
0
投票

Eigen 大量使用表达式模板来提高速度和效率。简而言之:算术运算符的返回类型不是算术运算的结果,而只是一些仅在需要时计算结果的句柄。这是更大的图景,老实说,我不明白具体发生了什么,但明确强制 Eigen 计算

Vector3d
可以解决您的问题:

auto lamb = [](Vector3d const& point) -> Vector3d {
    Vector3d const b{ 0., 0., 30. };
    return b + point.normalized();
    //Vector3d ret = b + point.normalized(); return ret;
    };

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.