std::ranges::views::as_rvalue, std::ranges::as_rvalue_view
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< ranges::view V > requires ranges::input_range<V> |
(1) | (C++23 起) |
namespace views { inline constexpr /* unspecified */ as_rvalue = /* unspecified */; |
(2) | (C++23 起) |
呼叫簽名 (Call signature) |
||
template< ranges::viewable_range R > requires /* 見下文 */ |
(C++23 起) | |
1) 一個範圍介面卡,表示底層
view
的檢視,其元素是右值。2) RangeAdaptorObject。令 e 為子表示式,令 T 為 decltype((e))。則表示式 views::as_rvalue(e) 表示式等價於
- views::all(e),如果它是良構表示式,T 建模
input_range
,且 std::same_as<ranges::range_rvalue_reference_t<T>, ranges::range_reference_t<T>> 為 true; - as_rvalue_view{e} 否則。
目錄 |
[編輯] 資料成員
成員 | 描述 |
V base_ (私有) |
底層檢視 (僅用於闡釋的成員物件*) |
[編輯] 成員函式
構造一個 as_rvalue_view (公開成員函式) | |
返回底層檢視 V (公開成員函式) | |
返回 as_rvalue_view 的起始迭代器(公開成員函式) | |
返回 as_rvalue_view 的結束迭代器(公開成員函式) | |
如果檢視有界,則返回檢視的大小 (公開成員函式) | |
繼承自 std::ranges::view_interface | |
如果派生檢視滿足 sized_range 或 forward_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_range 和 common_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>> = |
(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) |
將解引用物件的結果轉換為其關聯的右值引用型別 (定製點物件) |
(C++11) |
解引用為右值的迭代器介面卡 (類模板) |
(C++20) |
std::move_iterator的哨兵介面卡 (類模板) |
將 view 轉換為 constant_range (類模板) (範圍介面卡物件) |