C++ 是否存在范围::视图::转换的可修改视图版本?

C++ 是否存在范围::视图::转换的可修改视图版本?,c++,range-v3,C++,Range V3,考虑以下计划: #include <iostream> #include <algorithm> #include <numeric> #include <array> #include <range/v3/view/transform.hpp> int main() { using container = std::array<std::tuple<int,float,double>, 4>;

考虑以下计划:

#include <iostream>
#include <algorithm>
#include <numeric>
#include <array>
#include <range/v3/view/transform.hpp>

int main() {
    using container = std::array<std::tuple<int,float,double>, 4>;
    container tuples {{
        {1, 4.f, 8.},
        {2, 5.f, 9.},
        {3, 6.f, 10.},
        {4, 7.f, 11.}
    }};

    auto int_view =
        tuples | ranges::view::transform( [](auto& t){return std::get<int>(t);} );

    // int_view[1] = 3; // (*)

    auto x = std::accumulate(int_view.begin(), int_view.end(), 0);
    std::cout << "x = " << x << std::endl;
}
#包括
#包括
#包括
#包括
#包括
int main(){
使用container=std::array;
容器元组{{
{1,4.f,8.},
{2,5.f,9},
{3,6.f,10},
{4,7.f,11}
}};
自动内部视图=
tuples | ranges::view::transform([](auto&t){return std::get(t);});
//int_视图[1]=3;/(*)
auto x=std::累加(int_view.begin(),int_view.end(),0);

std::cout如果仔细想想,代码的问题很简单:

转换函数实际上是一个投影函数,您的函数不会生成允许修改源代码所需的引用,因为它使用,而这些函数从不推导引用

  • ,它保留引用,因此最好避免使用,除非您知道它们是正确的

    auto int_view = tuples | ranges::view::transform(
        [](auto& t)->decltype(auto){return std::get<int>(t);});
    
  • 最后,没有人阻止您返回像
    std::reference\u wrapper
    这样的代理。尽管这是一个不必要的复杂问题

    auto int_view = tuples | ranges::view::transform(
        [](auto& t){return std::ref(std::get<int>(t));});
    
    auto int_view=tuples | ranges::view::transform(
    [](auto&t){return std::ref(std::get(t));};
    

  • @einpoklum我解释过。所以,
    ->auto
    也不会推导出一个引用,而
    decltype(auto)
    会推导出一个?有趣。好吧,没那么有趣,但很重要。
    auto int_view = tuples | ranges::view::transform(
        [](auto& t){return std::ref(std::get<int>(t));});