Return 包含 ArrayWrapper 的表达式

Return an expression containing ArrayWrapper

我正在编写 C++/Python 混合语言。粘合这两个部分的库支持 Eigen matrix/array 但不支持张量。

这样做安全吗?

#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;

template<typename D>
auto f(DenseBase<D>& x, const Index i) {
    // x2 is destroyed when the program leaves 
    // this function.
    ArrayWrapper<D> x2(x.derived());  
    return x2.middleCols(i * 3, 3);
}

int main() {
    ArrayXf a(3, 9);
    a = 0;
    f(x, 1) = 1;
    std::cout << x << "\n";
}

或者,这样做更好吗?

template<typename D>
auto f(DenseBase<D>& x, const Index i) {
    return x.derived().array().middleCols(i * 3, 3);
}

两个版本一样,都是安全的。这是因为 middleCols() 返回的 ArrayWrapperBlock 等代理表达式是按值嵌套的,而不是按引用嵌套的。