对 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
是从中创建的。
我想使用对特征矩阵块的自动引用:
#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
是从中创建的。