C++20 で導入された std::views::all とは何ですか? 質問する

C++20 で導入された std::views::all とは何ですか? 質問する
#include <vector>
#include <ranges>

int main()
{
    auto v = std::vector{1, 2, 3, 4};
    v | std::views::drop(2); // ok
    std::views::all(v) | std::views::drop(2); // also ok
}

で正常にコンパイルされました。しかし、とg++11 -std=c++20の違いはわかりません。v | std::views::drop(2)std::views::all(v) | std::views::drop(2)

そこで私の質問は次のとおりです。

とは std::views::all C++20 で導入されましたか?

ベストアンサー1

v | std::views::drop(2)しかし、との違いは分かりませんstd::views::all(v) | std::views::drop(2)

実際、この 2 つには違いはありません。なぜなら、v | views::drop(2)はすでに を意味しているからですviews::all(v) | views::drop(2)

views::all範囲アダプタが常に適応することを保証する範囲の実装の詳細ですビュー(範囲ではありません)。これで、views::all(v)結果がビューであることを確認するだけです。つまり、([範囲.すべて]):

部分式が与えられた場合E、その式はviews​::​all(E)次の式と同等になります。

  • decay-copy(E)減衰型のEモデルの場合view
  • それ以外の場合、ref_­view{E}その式が整形式である場合。
  • さもないと、subrange{E}

あなたの場合、vは でありvector<int>、 をモデル化しませんview。しかし、それは左辺値なので、ref_view{v}整形式であるため、そのようになります。

すべてのアダプタはviews::all内部で使用します。たとえば、drop_view次の推論ガイドがあります。

template <class R>
drop_view(R&&, range_difference_t<R>) -> drop_view<views::all_t<R>>;

drop_view(v, 2)したがって、 (決してmeow_view直接使用せず、常に を使用してください)と記述した場合views::meow、それ自体が呼び出されますviews::all

おすすめ記事