问题描述
考虑以下代码:
#include <chrono>
#include <iostream>
#include "xtensor/xadapt.hpp"
#include "xtensor/xarray.hpp"
#include "xtensor/xindex_view.hpp"
#include "xtensor/xio.hpp"
#include "xtensor/xview.hpp"
using namespace std;
using namespace std::chrono;
int main() {
high_resolution_clock::time_point t1 = high_resolution_clock::Now();
for (int i = 0; i < 1000; i++) {
xt::expression<float> a = xt::zeros<float>({3,256,256});
}
high_resolution_clock::time_point t2 = high_resolution_clock::Now();
duration<double> time = duration_cast<duration<double>>(t2 - t1);
cout << time.count() << endl;
}
编译失败,错误如下:test.cpp:24:66: error: ‘xt::xexpression<D>::~xexpression() [with D = float]’ is protected within this context
。
将 xt::xexpression<float>
(the correct return type) 更改为 auto
时,它会编译并运行。如果 xt::expression
受到保护,为什么 auto
可以访问它?有没有一种方法可以指定类型而不是使用 auto
,而不评估 xexpression? (即我不能让 a
的类型为 xt::xarray
,因为这会强制求值)。
解决方法
正如凯文在评论中指出的那样,
Auto
不是解析为 xexpression
,而是 xexpression
的子代。将类型更改为 xt::xbroadcast<xt::xscalar<float>,std::array<long unsigned int,3> >
将在不求值的情况下进行编译。