Namespaces
Variants

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

来自 zh.cppreference.net
 
 
范围库
范围适配器
 
定义于头文件 <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 /* see below */
constexpr ranges::view auto as_rvalue( R&& r );
(C++23 起)
1) 一个范围适配器,表示底层 视图 的视图,其元素为右值。
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 的结束迭代器
(公开成员函数)
若视图有界则返回其大小
(公开成员函数)
返回底层 approximately_sized_range 的近似大小
(公开成员函数)
继承自 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> 的公开成员函数)
返回第 nth 个元素,仅当它满足 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
(类模板) (范围适配器对象)