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()
返回的 ArrayWrapper
或 Block
等代理表达式是按值嵌套的,而不是按引用嵌套的。
我正在编写 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()
返回的 ArrayWrapper
或 Block
等代理表达式是按值嵌套的,而不是按引用嵌套的。