Namespaces
Variants

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

From cppreference.net
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 /* 未指定 */ as_rvalue = /* 未指定 */ ;

}
(2) (C++23 起)
调用签名
template < ranges:: viewable_range R >

requires /* 见下文 */

constexpr ranges:: view auto as_rvalue ( R && r ) ;
(C++23 起)
1) 一个范围适配器,表示对底层 view 的视图,其元素均为右值。
2) RangeAdaptorObject 。令 e 为子表达式, T decltype ( ( e ) ) 。则表达式 views :: as_rvalue ( e ) 与下列表达式 表达式等价

目录

数据成员

成员 描述
V base_ (私有) 底层视图
( 仅用于说明的成员对象* )

成员函数

构造 as_rvalue_view
(公开成员函数)
返回底层视图 V
(公开成员函数)
返回 as_rvalue_view 的起始迭代器
(公开成员函数)
返回 as_rvalue_view 的结束迭代器
(公开成员函数)
若视图有界则返回其大小
(公开成员函数)
返回底层 approximately_sized_range 的近似大小
(公开成员函数)
继承自 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) (since C++23)
constexpr explicit as_rvalue_view ( V base ) ;
(2) (since 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) (since C++23)
constexpr V base ( ) && ;
(2) (since C++23)

返回底层视图。

1) 通过复制构造从底层视图返回结果。等价于 return base_  ;
2) 通过移动构造从底层视图返回结果。等价于 return std :: move ( base_  ) ;

std::ranges::as_rvalue_view:: begin

constexpr auto begin ( ) requires ( ! /*simple-view*/ < V > ) ;
(1) (since C++23)
constexpr auto begin ( ) const requires ranges:: range < const V > ;
(2) (since C++23)

返回 std:: move_iterator ( ranges:: begin ( base_  ) )

std::ranges::as_rvalue_view:: end

constexpr auto end ( ) requires ( ! /*simple-view*/ < V > ) ;
(1) (since C++23)
constexpr auto end ( ) const requires ranges:: range < const V > ;
(2) (since C++23)

(1) V (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) (since C++23)
constexpr auto size ( ) const requires ranges:: sized_range < const V > ;
(2) (since C++23)

当视图有界时返回其大小。等价于 return ranges:: size ( base_  ) ;

std::ranges::as_rvalue_view:: reserve_hint

constexpr auto reserve_hint ( )
requires ranges :: approximately_sized_range < V > ;
(1) (since C++26)
constexpr auto reserve_hint ( ) const
requires ranges :: approximately_sized_range < const V > ;
(2) (since C++26)

返回 ranges :: reserve_hint ( 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 起)

ranges::enable_borrowed_range 的特化使得当底层视图满足 borrowed_range 时, as_rvalue_view 也满足该概念。

注释

功能测试 标准 功能特性
__cpp_lib_ranges_as_rvalue 202207L (C++23) std::ranges::as_rvalue_view
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range reserve_hint

示例

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string>
#include <vector>
int main()
{
    std::vector<std::string> words =
        {"Quick", "red", "\N{FOX FACE}", "jumped", "over", "a", "pterodactyl"};
    std::vector<std::string> new_words;
    std::ranges::copy(
        words | std::views::as_rvalue,
        std::back_inserter(new_words)); // 将字符串从 words 移动到 new_words
    auto quoted = std::views::transform([](auto&& s) { return "“" + s + "”"; });
    std::cout << "旧词汇: ";
    for (auto&& word : words | std::views::as_rvalue | quoted)
        std::cout << word << ' ';
    std::cout << "\n新词汇: ";
    for (auto&& word : new_words | std::views::as_rvalue | quoted)
        std::cout << word << ' ';
}

可能的输出:

旧词汇: “” “” “” “” “” “” “” 
新词汇: “Quick” “red” “🦊” “jumped” “over” “a” “pterodactyl”

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 4083 C++23 views::as_rvalue 过去接受非输入范围 改为拒绝

参见

(C++20)
将对对象解引用的结果转换为其关联的右值引用类型
(定制点对象)
解引用为右值的迭代器适配器
(类模板)
std::move_iterator 的哨兵适配器
(类模板)
view 转换为 constant_range
(类模板) (范围适配器对象)