Sie haben Recht, dass es sich um ein Problem mit der Wandlungsfähigkeit handelt. Wenn Sie const vec&
verwenden, können Sie nur auf eine const mat
wo es sich als
Map<const mat> reshape (const vec& b, const uint n, const uint m) {
return Map<const mat>(b.data(), n, m);
}
sonst hat man die Komponenten eines const vec über die abgebildeten Matrix verändern können. Es hat nichts mit der Speicherzuweisung zu tun.
Eigentlich sind beide vec
und const vec
falsch. Beide bedeuten die Abbildung auf eine temporäre Kopie des ursprünglichen Vektors, dessen Leben nach dem Funktionsaufruf endet, wie Avi Ginsburg sagte, was zu einem undefinierten Verhalten führt.
Bitte beachten Sie, dass der obige Code nur korrekt ist, wenn der Eingang ein Eigen::VectorXd
ist.
Tatsächlich können sowohl vec&
als auch const vec&
falsch sein, wenn Ihre Eingabe b
ein Ausdruck ist. Die Verwendung von vec&
führt nicht zum Kompilieren, da die Komponenten eines Ausdrucks nicht veränderbar sind. Die Verwendung von erzwingt, dass der Ausdruck während des Funktionsaufrufs in einen temporären konstanten Vektor umgewandelt wird, und Sie ordnen ihn erneut einem Temp-Vektor zu.
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
In diesem Fall können Sie den Ausdruck Typ als Parameter Typ verwenden müssen, obwohl Sie wahrscheinlich Ihre reshape
mit Ausdrücken nicht benutzen zu. Sie können mehr Details hier finden.
http://eigen.tuxfamily.org/dox-devel/TopicFunctionTakingEigenTypes.html