对 Eigen 块的自动引用未按预期运行

auto reference to Eigen block not behaving as expected

我想使用对特征矩阵块的自动引用:

#include <Eigen/Dense>
using namespace Eigen;
void foo(MatrixXf& a)
{
    auto& a_block = a.block(2, 3, 4, 5);
    a_block = MatrixXf::Random(4,5);
}    

这不能用 GCC 编译,因为 a.block(2, 3, 4, 5) 被评估为一个临时的,而 a.block(2, 3, 4, 5) = MatrixXf::Random(4,5); 完美地工作。

在我看来,这不是预期的行为。这个问题有优雅的解决方法吗?这应该被视为对 Eigen 的错误/功能请求吗?

编辑:

使用 auto 而不是 auto& 解决了问题!

该问题已被标记为与 Reference a temporary in msvc 重复,但与 MSVC 无关。我还明确表示 a.block(2, 3, 4, 5) 被评估为临时值。问题是关于这是否是 Eigen 的正确行为。

block 实际上并不是 return 引用,而是创建了一个类型为 Block 的类似引用的对象。不能将新创建的任何类型的右值分配给非 const 左值引用,因此这都是预期的行为。

分配给 Block 右值很好,因为它有一个重载的 operator= (不幸的是,它没有在文档页面中获得自己的条目,因为它看起来像它们生成 = 使用宏定义)。然后 = 函数将您的所有数据发送到 Matrix 的相关部分,Block 是从中创建的。