名前空間
変種
操作

std::ranges::views::as_rvalue, std::ranges::as_rvalue_view

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <ranges> で定義
template< ranges::view V >

    requires ranges::input_range<V>
class as_rvalue_view

    : public ranges::view_interface<as_rvalue_view<V>>
(1) (C++23から)
namespace views {

    inline constexpr /* unspecified */ as_rvalue = /* unspecified */;

}
(2) (C++23から)
呼び出しシグネチャ
template< ranges::viewable_range R >

    requires /* 以下を参照 */

constexpr ranges::view auto as_rvalue( R&& r );
(C++23から)
1) 基本となる view の要素が右辺値であるビューを表す範囲アダプタ。
2) RangeAdaptorObjecte を部分式とし、 Tdecltype((e)) とする。このとき、式 views::as_rvalue(e) は次のいずれかに式として等価である。

目次

[編集] データメンバー

メンバ 説明
V base_ (private) 基盤となるビュー
(説明用のメンバオブジェクト*)

[編集] メンバー関数

as_rvalue_view を構築する
(public member function)
基本となるビュー V を返す
(public member function)
as_rvalue_view の開始イテレータを返す
(public member function)
as_rvalue_view の終了イテレータを返す
(public member function)
ビューが有界である場合、そのサイズを返す
(public member function)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(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_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

std::ranges::as_rvalue_view::as_rvalue_view

as_rvalue_view() requires std::default_initializable<V> = default;
(1) (C++23から)
constexpr explicit as_rvalue_view( V base );
(2) (C++23から)
1) デフォルトメンバ初期化子 (= V()) を介して base_ を値初期化する。
2) base_std::move(base) で初期化する。

パラメータ

base - ビュー

std::ranges::as_rvalue_view::base

constexpr V base() const& requires std::copy_constructible<V>;
(1) (C++23から)
constexpr V base() &&;
(2) (C++23から)

基本となるビューを返す。

1) 基本となるビューから結果をコピー構築する。 return base_; と等価。
2) 基本となるビューから結果をムーブ構築する。 return std::move(base_); と等価。

std::ranges::as_rvalue_view::begin

constexpr auto begin() requires (!/*simple-view*/<V>);
(1) (C++23から)
constexpr auto begin() const requires ranges::range<const V>;
(2) (C++23から)
1,2) std::move_iterator(ranges::begin(base_)) を返す。

std::ranges::as_rvalue_view::end

constexpr auto end() requires (!/*simple-view*/<V>);
(1) (C++23から)
constexpr auto end() const requires ranges::range<const V>;
(2) (C++23から)
1) Vcommon_range をモデル化する場合、 std::move_iterator(ranges::end(base_)) を返し、それ以外の場合は std::move_sentinel(ranges::end(base_)) を返す。
2) const Vcommon_range をモデル化する場合、 std::move_iterator(ranges::end(base_)) を返し、それ以外の場合は std::move_sentinel(ranges::end(base_)) を返す。

std::ranges::as_rvalue_view::size

constexpr auto size() requires ranges::sized_range<V>;
(1) (C++23から)
constexpr auto size() const requires ranges::sized_range<const V>;
(2) (C++23から)

ビューが有界である場合、そのサイズを返す。

1,2) return ranges::size(base_); と等価。

[編集] 推論ガイド

template< class R >
as_rvalue_view( R&& ) -> as_rvalue_view<views::all_t<R>>;
(C++23から)

[編集] ヘルパーテンプレート

template< class T >

constexpr bool enable_borrowed_range<std::ranges::as_rvalue_view<T>> =

    ranges::enable_borrowed_range<T>;
(C++23から)

std::ranges::enable_borrowed_range のこの特殊化は、基本となるビューが borrowed_range を満たす場合に as_rvalue_view もそれを満たすようにする。

[編集] 備考

機能テストマクロ 規格 機能
__cpp_lib_ranges_as_rvalue 202207L (C++23) std::ranges::as_rvalue_view

[編集]

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string>
#include <vector>
 
int main()
{
    std::vector<std::string> words =
        {"the", "quick", "brown", "\N{FOX FACE}", "ate", "an", "archeopteryx"};
    std::vector<std::string> new_words;
 
    std::ranges::copy(
        words | std::views::as_rvalue,
        std::back_inserter(new_words)); // move string from words into new_words
 
    auto quoted = std::views::transform([](auto&& s) { return "“" + s + "”"; });
 
    std::cout << "Words: ";
    for (auto&& word : words | std::views::as_rvalue | quoted)
        std::cout << word << ' ';
 
    std::cout << "\nNew words: ";
    for (auto&& word : new_words | std::views::as_rvalue | quoted)
        std::cout << word << ' ';
}

実行結果の例

Words: “” “” “” “” “” “” “” 
New words: “the” “quick” “brown” “🦊” “ate” “an” “archeopteryx”

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 4083 C++23 views::as_rvalue は以前、非入力範囲を受け入れていた 拒否されるようになりました

[編集] 関連項目

(C++20)
オブジェクトの間接参照の結果を、その関連する右辺値参照型にキャストする
(カスタマイゼーションポイントオブジェクト)[編集]
間接参照すると右辺値になるイテレータアダプタ
(クラステンプレート) [編集]
std::move_iterator のための番兵 (sentinel) アダプタ
(クラステンプレート) [編集]
viewconstant_range に変換する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)