1

我正在学习 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 行,我将临时返回。

我的目标是一次只计算一个渲染并将它们一一添加到总和中。显然这不适用于上面的代码。是否有可能使用范围库来制定它以及如何制定?

4

0 回答 0