我想使用对本征矩阵块的自动引用:
#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)
很明显被评估为临时变量。问题在于这是否是本征的正确行为。
答案 0 :(得分:3)
block
实际上并不返回引用,而是创建类型为Block
的类似于引用的对象。不能将任何类型的新创建的右值分配给非{const
}左值引用,因此这是所有预期的行为。
分配一个Block
右值是正确的,因为它有一个重载的operator=
(不幸的是,它似乎没有生成自己的条目=
使用宏定义)。然后,该=
函数会将您的所有数据发送到创建Matrix
的{{1}}的相关部分。