`std::views` 的右关联性

Red*_*ave 0 c++ std-ranges c++23

左关联性已由 C++ 核心语义保证: R|V1|V2被解析为(R|V1)|V2). 如果编码员想要显式地将操作顺序更改为 ,该怎么办R|(V1|V2)?这在 C++23 下可能吗?这个问题背后的原因是它简化了自定义范围适配器的定义:

auto myV=V1|V2|V3;
for(auto& x:R1|myV)/*..*/;
for(auto& x:R2|myV)/*..*/;
Run Code Online (Sandbox Code Playgroud)

所有这些需求似乎都是对 ; 的适当约束过载std::views::operator|;这种超载是否存在?如果没有的话会添加吗?如果不是,其背后的理由是什么?

Bar*_*rry 5

如果编码员想要显式地将操作顺序更改为 ,该怎么办R|(V1|V2)

然后他们就可以这样写。这是一个有效的表达。

范围适配器闭包对象的定义方式有两种等价(这里是范围适配器闭包对象并且C是一个范围):DR

  • R | C相当于C(R)
  • R | (C | D)相当于R | C | D

后者是让您写下您要询问的内容的属性。例如:

auto flat_map = [](auto f){
    return views::transform(f) | views::join;
};

vector<int> v = {1, 2, 3};
auto w = v | flat_map([](int i){ return vector<int>(i, i); }
Run Code Online (Sandbox Code Playgroud)

而这里w就变成了范围[1, 2, 2, 3, 3, 3]