C++11 有没有办法在Range-v3中拥有读写视图?

C++11 有没有办法在Range-v3中拥有读写视图?,c++11,proxy,rvalue,lvalue,range-v3,C++11,Proxy,Rvalue,Lvalue,Range V3,在其中,可以轻松创建现有容器的视图。比如说 #include<range/v3/view/transform.hpp> #include<cassert> int main(){ std::vector<double> v = {1,2,3}; auto range = v | ranges::v3::view::transform([](auto x){return x*2;}); assert( range[1] == 4 );

在其中,可以轻松创建现有容器的视图。比如说

#include<range/v3/view/transform.hpp>
#include<cassert>

int main(){
    std::vector<double> v = {1,2,3};
    auto range = v | ranges::v3::view::transform([](auto x){return x*2;});
    assert( range[1] == 4 );
//    range[1] = 4; // error cannot write to an l-value
}

您可以使
transform\u视图
具有代理类型的元素:

#include<vector>
#include<range/v3/view/transform.hpp>
#include<cassert>

struct proxy {
    double& x;
    operator double() { return x*2; }
    void operator=(double y) { x = y / 2; }
};

int main(){
    std::vector<double> v = {1,2,3};
    auto range = v | ranges::v3::view::transform([](auto& x){return proxy{x};});
    assert( range[1] == 4 );
    range[1] = 8;
    assert( range[1] == 8 );
    assert( v[1] == 4 );
}
#包括
#包括
#包括
结构代理{
双&x;
运算符double(){return x*2;}
void运算符=(双y){x=y/2;}
};
int main(){
向量v={1,2,3};
auto-range=v | ranges::v3::view::transform([](auto&x){return proxy{x};});
断言(范围[1]==4);
范围[1]=8;
断言(范围[1]==8);
断言(v[1]==4);
}

当然可以。杰出的我很惊讶,
void操作符=(双y)
不需要是
const
。假设代理在这种情况下是临时的。
#include<vector>
#include<range/v3/view/transform.hpp>
#include<cassert>

struct proxy {
    double& x;
    operator double() { return x*2; }
    void operator=(double y) { x = y / 2; }
};

int main(){
    std::vector<double> v = {1,2,3};
    auto range = v | ranges::v3::view::transform([](auto& x){return proxy{x};});
    assert( range[1] == 4 );
    range[1] = 8;
    assert( range[1] == 8 );
    assert( v[1] == 4 );
}