你是对的,这是一个可变性问题。如果你使用const vec&
,你只能将它映射到const mat
as
Map<const mat> reshape (const vec& b, const uint n, const uint m) {
return Map<const mat>(b.data(), n, m);
}
否则,您可以通过映射矩阵修改 const vec 的分量。它与分配内存无关。
其实两者都有vec
and const vec
错了。它们都意味着映射到原始向量的临时副本,正如阿维·金斯伯格所说,其生命在函数调用后结束,从而导致未定义的行为。
请注意,上述代码仅在输入为Eigen::VectorXd
.
事实上两者vec&
and const vec&
如果您的输入可能是错误的b
是一个表达式。使用vec&
由于表达式的组成部分不可变,因此编译将失败。使用const vec&
将在函数调用期间强制将表达式计算为临时常量向量,并且您将再次映射到临时向量。
Map<mat> reshape (vec& b, const uint n, const uint m) {
return Map<const mat>(b.data(), n, m);
}
Map<const mat> reshape_const (const vec& b, const uint n, const uint m) {
return Map<const mat>(b.data(), n, m);
}
vec a(100), b(100);
Map<mat> c1 = reshap(a, 10, 10); // ok
Map<mat> c2 = reshap(a + b, 10, 10); // error, expression not mutable
Map<const mat> c3 = reshap_const(a, 10, 10); // ok
Map<const mat> c4 = reshap_const(a + b, 10, 10); // error, mapping to temp vec
在这种情况下,您需要使用表达式类型作为参数类型,尽管您可能不打算使用您的reshape
与表达。您可以在这里找到更多详细信息。
http://eigen.tuxfamily.org/dox-devel/TopicFunctionTakingEigenTypes.html http://eigen.tuxfamily.org/dox-devel/TopicFunctionTakingEigenTypes.html