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

yar*_*yar 1 c++ eigen c++11 eigen3

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

#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);
}    
Run Code Online (Sandbox Code Playgroud)

这不能用 GCC 编译,因为a.block(2, 3, 4, 5)被评估为临时的,但a.block(2, 3, 4, 5) = MatrixXf::Random(4,5);工作得很好。

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

编辑:

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

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

heg*_*000 6

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

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