#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
。