Вы можете исправить проблему времени выполнения с помощью auto x2 = x.array().derived();
, то есть: обратный массив и производный.Но auto
здесь не желателен.Вот почему.Допустим, у вас есть:
template <typename T> void foo(DenseBase<T> &x);
Если T
- это Array<>
, тогда x.array().derived()
- это Array<>
, а x2
будет глубокой копией x
.В этом случае вы хотели бы использовать auto& x2 = ...
.
Если T
- это что-то еще, например, Matrix<>
, то auto x2 = x.array().derived();
отлично подходит, но не auto& x2 = ...
.
Итак, что вы действительно хотите, так это что-то сложное:
internal::ref_selector<std::decay<decltype(x.array().derived())>::type>::non_const_type
x2 = x.array().derived();
Не приятно: (
Более простое решение - не беспокоиться и создать ArrayWrapper
даже для входов, которыеуже находятся в мире массивов:
ArrayWrapper<T> x2(x.derived());
Еще одно простое решение состоит в том, чтобы заставить вызывающую сторону передавать выражения в мире массивов:
template <typename T> void foo(ArrayBase<T> &x) {
T& x2(x.derived());
...
}