自动引用本征块的行为不符合预期

时间:2019-03-17 12:09:01

标签: c++ c++11 eigen 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);
}    

这不能与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)很明显被评估为临时变量。问题在于这是否是本征的正确行为。

1 个答案:

答案 0 :(得分:3)

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

分配一个Block右值是正确的,因为它有一个重载的operator=(不幸的是,它似乎没有生成自己的条目=使用宏定义)。然后,该=函数会将您的所有数据发送到创建Matrix的{​​{1}}的相关部分。

相关问题