std::ranges::owning_view
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::range R > requires std::movable<R> && (!/*is-initializer-list*/<R>) |
(C++20以降) | |
owning_viewは、rangeのユニークな所有権を持つviewです。ムーブ専用であり、そのrangeを内部に格納します。
requires節にある定数/*is-initializer-list*/<R>は、std::remove_cvref_t<R>がstd::initializer_listの特殊化である場合にのみtrueとなります。
目次 |
[編集] データメンバ
| メンバ名 | 定義 |
r_ (private) |
型Rの基底となるrange。(説明用のメンバオブジェクト*) |
[編集] メンバ関数
格納されているrangeを値初期化またはムーブ構築してowning_viewを構築します。(public member function) | |
| 格納されているrangeをムーブ代入します。 (public member function) | |
| 格納されているrangeへの参照を返します。 (public member function) | |
| 格納されているrangeの開始イテレータを返します。 (public member function) | |
| 格納されているrangeのセンチネルを返します。 (public member function) | |
| 格納されているrangeが空かどうかをチェックします。 (public member function) | |
格納されているsized_rangeのサイズを返します。(public member function) | |
格納されているcontiguous_rangeの先頭へのポインタを返します。(public member function) | |
std::ranges::view_interface から継承 | |
| (C++23) |
範囲の先頭への定数イテレータを返す ( std::ranges::view_interface<D> の public メンバ関数) |
| (C++23) |
範囲の定数イテレータの番兵を返す ( std::ranges::view_interface<D> の public メンバ関数) |
| 派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される ( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが bidirectional_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
std::ranges::owning_view::owning_view
| owning_view() requires std::default_initializable<R> = default; |
(1) | (C++20以降) |
| owning_view( owning_view&& other ) = default; |
(2) | (C++20以降) |
| constexpr owning_view( R&& t ); |
(3) | (C++20以降) |
| owning_view( const owning_view& ) = delete; |
(4) | (C++20以降) |
1) デフォルトコンストラクタ。格納されているrangeをデフォルトメンバ初期化子(= R())で値初期化します。
2) ムーブコンストラクタ。otherの格納されているrangeからムーブ構築します。
3) 格納されているrangeをtからムーブ構築します。
4) コピーコンストラクタは削除されています。
owning_viewはムーブ専用です。パラメータ
| その他 | - | ムーブ元となる別のowning_view |
| t | - | ムーブ元のrange |
std::ranges::owning_view::operator=
| owning_view& operator=( owning_view&& other ) = default; |
(1) | (C++20以降) |
| owning_view& operator=( const owning_view& ) = delete; |
(2) | (C++20以降) |
1) ムーブ代入演算子。otherの格納されているrangeからムーブ代入します。
2) コピー代入演算子は削除されています。
owning_viewはムーブ専用です。パラメータ
| その他 | - | ムーブ元となる別のowning_view |
戻り値
*this
std::ranges::owning_view::base
| constexpr R& base() & noexcept; |
(1) | (C++20以降) |
| constexpr const R& base() const & noexcept; |
(2) | (C++20以降) |
| constexpr R&& base() && noexcept; |
(3) | (C++20以降) |
| constexpr const R&& base() const && noexcept; |
(4) | (C++20以降) |
値カテゴリとconst修飾を維持したまま、格納されているrangeへの参照を返します。
1,2) return r_; と同等です。
3,4) return std::move(r_); と同等です。
std::ranges::owning_view::begin
| constexpr ranges::iterator_t<R> begin(); |
(1) | (C++20以降) |
| constexpr auto begin() const requires ranges::range<const R>; |
(2) | (C++20以降) |
return ranges::begin(r_); と同等です。
std::ranges::owning_view::end
| constexpr ranges::sentinel_t<R> end(); |
(1) | (C++20以降) |
| constexpr auto end() const requires ranges::range<const R>; |
(2) | (C++20以降) |
return ranges::end(r_); と同等です。
std::ranges::owning_view::empty
| constexpr bool empty() requires requires { ranges::empty(r_); }; |
(1) | (C++20以降) |
| constexpr bool empty() const requires requires { ranges::empty(r_); }; |
(2) | (C++20以降) |
return ranges::empty(r_); と同等です。
std::ranges::owning_view::size
| constexpr auto size() requires ranges::sized_range<R>; |
(1) | (C++20以降) |
| constexpr auto size() const requires ranges::sized_range<const R>; |
(2) | (C++20以降) |
return ranges::size(r_); と同等です。
std::ranges::owning_view::data
| constexpr auto data() requires ranges::contiguous_range<R>; |
(1) | (C++20以降) |
| constexpr auto data() const requires ranges::contiguous_range<const R>; |
(2) | (C++20以降) |
return ranges::data(r_); と同等です。
[編集] ヘルパーテンプレート
| template< class T > constexpr bool enable_borrowed_range<std::ranges::owning_view<T>> = |
(C++20以降) | |
このranges::enable_borrowed_rangeの特殊化により、基底となるrangeがborrowed_rangeを満たす場合、owning_viewはborrowed_rangeを満たします。
[編集] 例
このコードを実行
#include <cassert> #include <iostream> #include <ranges> #include <string> int main() { using namespace std::literals; std::ranges::owning_view ov{"cosmos"s}; // the deduced type of R is std::string; // `ov` is the only owner of this string assert( ov.empty() == false && ov.size() == 6 && ov.size() == ov.base().size() && ov.front() == 'c' && ov.front() == *ov.begin() && ov.back() == 's' && ov.back() == *(ov.end() - 1) && ov.data() == ov.base() ); std::cout << "sizeof(ov): " << sizeof ov << '\n' // typically equal to sizeof(R) << "range-for: "; for (const char ch : ov) std::cout << ch; std::cout << '\n'; std::ranges::owning_view<std::string> ov2; assert(ov2.empty()); // ov2 = ov; // compile-time error: copy assignment operator is deleted ov2 = std::move(ov); // OK assert(ov2.size() == 6); }
実行結果の例
sizeof(ov): 32 range-for: cosmos
[編集] 関連項目
| (C++20) |
他の何らかのrangeの要素の view(クラステンプレート) |
| (C++20) |
rangeのすべての要素を含む view(エイリアステンプレート) (rangeアダプタオブジェクト) |