名稱空間
變體
操作

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

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
定義於標頭檔案 <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 起)
呼叫簽名 (Call signature)
template< ranges::viewable_range R >

    requires /* 見下文 */

constexpr ranges::view auto as_rvalue( R&& r );
(C++23 起)
1) 一個範圍介面卡,表示底層 view 的檢視,其元素是右值。
2) RangeAdaptorObject。令 e 為子表示式,令 Tdecltype((e))。則表示式 views::as_rvalue(e) 表示式等價於

目錄

[編輯] 資料成員

成員 描述
V base_ (私有) 底層檢視
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個 as_rvalue_view
(公開成員函式)
返回底層檢視 V
(公開成員函式)
返回 as_rvalue_view 的起始迭代器
(公開成員函式)
返回 as_rvalue_view 的結束迭代器
(公開成員函式)
如果檢視有界,則返回檢視的大小
(公開成員函式)
繼承自 std::ranges::view_interface
如果派生檢視滿足 sized_rangeforward_range,則返回其是否為空
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視是否非空,僅當 ranges::empty 適用於它時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第一個元素,如果它滿足 forward_range 則提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
如果派生檢視滿足 bidirectional_rangecommon_range,則返回其最後一個元素
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第 n 個元素,僅當它滿足 random_access_range 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]

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)std::move(base) 初始化 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) 如果 V 建模 common_range,則返回 std::move_iterator(ranges::end(base_)),否則返回 std::move_sentinel(ranges::end(base_))
2) 如果 const V 建模 common_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 的特化使得 as_rvalue_view 在底層檢視滿足該條件時滿足 borrowed_range

[編輯] 註解

特性測試 標準 特性
__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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 4083 C++23 views::as_rvalue 曾接受非輸入範圍 已拒絕

[編輯] 參閱

(C++20)
將解引用物件的結果轉換為其關聯的右值引用型別
(定製點物件)[編輯]
解引用為右值的迭代器介面卡
(類模板) [編輯]
std::move_iterator的哨兵介面卡
(類模板) [編輯]
view 轉換為 constant_range
(類模板) (範圍介面卡物件)[編輯]