我正在学习 range-v3 库,并且在编译以下代码时遇到问题:
#include <range/v3/all.hpp>
#include <iostream>
#include <vector>
using namespace ranges;
using std::vector;
using std::pair;
// does not use ranges in my actual code
vector<float> render(unsigned width, unsigned i) {
std::mt19937 gen(i);
std::uniform_real_distribution<float> dis(0.f, 1.f);
return to_vector(view::generate_n(
[&gen, &dis](){ return dis(gen); },
width));
}
int main()
{
unsigned n = 2;
unsigned width = 3;
auto sq = [](auto v) { return v * v; };
auto addPairs = [](auto a, auto b) {
return std::make_pair(a.first + b.first, a.second + b.second);
};
auto addPairVectors = [addPairs](auto rA, auto rB) {
return view::zip_with(addPairs, rA, rB);
};
auto valueError = [sq](float i, float ref) {
return std::make_pair(i, sq(i - ref));
};
vector<float> reference(width, 0.5f);
auto renderData =
view::iota(0u, n)
/*line 39*/ | view::transform([width](auto i) { return render(width, i); })
| view::join;
auto referenceRepeated =
view::repeat(reference)
| view::join;
auto renderDataWithError =
/*line 47*/ view::zip_with(valueError, renderData, referenceRepeated)
| view::chunk(width);
auto nTimesResultAndError = accumulate(renderDataWithError,
vector<pair<float, float>>(width),
addPairVectors);
float nInv = 1.f/n;
auto result = to_vector(
nTimesResultAndError
| view::transform([nInv](auto v) { return v.first * nInv;}) );
auto stdDev = to_vector(
nTimesResultAndError
| view::transform([nInv](auto v) {
return std::sqrt(v.second * nInv);
}));
return 0;
}
g++ 说:
../rangesTest/main.cpp:47:69: required from here
../rangesTest/include/range/v3/view/all.hpp:78:35:
error: static assertion failed: Cannot get a view of a temporary container
我已经尝试过 g++7 和 8 以及 clang 6。他们都说了类似的话。我的理解是问题出在第 39 行,我将临时返回。
我的目标是一次只计算一个渲染并将它们一一添加到总和中。显然这不适用于上面的代码。是否有可能使用范围库来制定它以及如何制定?