std::ranges:: ref_view
|
定义于头文件
<ranges>
|
||
|
template
<
ranges::
range
R
>
requires
std::
is_object_v
<
R
>
|
(C++20 起) | |
ref_view
是对其他某个
range
中元素的
view
。它封装了对该
range
的引用。
目录 |
数据成员
| 成员 | 描述 |
R*
r_
|
指向底层范围的指针
( 仅用于说明的成员对象* ) |
成员函数
构造引用给定范围的
ref_view
(公开成员函数) |
|
|
返回被引用范围的引用
(公开成员函数) |
|
|
返回被引用范围的起始迭代器
(公开成员函数) |
|
|
返回被引用范围的哨兵
(公开成员函数) |
|
|
检查被引用范围是否为空
(公开成员函数) |
|
返回被引用
sized_range
的大小
(公开成员函数) |
|
|
(C++26)
|
返回被引用
approximately_sized_range
的近似大小
(公开成员函数) |
返回被引用
contiguous_range
起始位置的指针
(公开成员函数) |
|
继承自 std::ranges::view_interface |
|
|
(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::ref_view:: ref_view
|
template
<
/*different-from*/
<
ref_view
>
T
>
requires
std::
convertible_to
<
T, R
&
>
&&
|
(since C++20) | |
使用
std::
addressof
(
static_cast
<
R
&
>
(
std::
forward
<
T
>
(
t
)
)
)
初始化
r_
。
当且仅当
std::
remove_cvref_t
<
T
>
和
std::
remove_cvref_t
<
U
>
不是相同类型,且
_FUN
的重载声明为
void
_FUN
(
R
&
)
;
void
_FUN
(
R
&&
)
=
delete
;
时,满足
/*different-from*/
<
T, U
>
。
参数
| t | - | 要引用的范围 |
std::ranges::ref_view:: begin
|
constexpr
ranges::
iterator_t
<
R
>
begin
(
)
const
;
|
(since C++20) | |
返回
ranges::
begin
(
*
r_
)
。
std::ranges::ref_view:: end
|
constexpr
ranges::
sentinel_t
<
R
>
end
(
)
const
;
|
(since C++20) | |
返回
ranges::
end
(
*
r_
)
。
std::ranges::ref_view:: empty
|
constexpr
bool
empty
(
)
const
requires requires { ranges:: empty ( * r_ ) ; } ; |
(since C++20) | |
返回
ranges::
empty
(
*
r_
)
。
std::ranges::ref_view:: size
|
constexpr
auto
size
(
)
const
requires ranges:: sized_range < R > ; |
(since C++20) | |
返回
ranges::
size
(
*
r_
)
。
std::ranges::ref_view:: reserve_hint
|
constexpr
auto
size
(
)
const
requires ranges :: approximately_sized_range < R > ; |
(since C++26) | |
返回
ranges
::
reserve_hint
(
*
r_
)
。
std::ranges::ref_view:: data
|
constexpr
auto
data
(
)
const
requires ranges:: contiguous_range < R > ; |
(since C++20) | |
返回
ranges::
data
(
*
r_
)
。
推导指引
|
template
<
class
R
>
ref_view ( R & ) - > ref_view < R > ; |
(自 C++20 起) | |
辅助模板
|
template
<
class
T
>
constexpr bool enable_borrowed_range < ranges :: ref_view < T >> = true ; |
(C++20 起) | |
对
std::ranges::enable_borrowed_range
的这一特化使
ref_view
满足
borrowed_range
的要求。
注释
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) |
ranges::approximately_sized_range
和
reserve_hint
|
示例
#include <iostream> #include <ranges> int main() { const std::string s{"cosmos"}; const std::ranges::take_view tv{s, 3}; const std::ranges::ref_view rv{tv}; std::cout << std::boolalpha << "调用 empty(): " << rv.empty() << '\n' << "调用 size() : " << rv.size() << '\n' << "调用 begin(): " << *rv.begin() << '\n' << "调用 end() : " << *(rv.end() - 1) << '\n' << "调用 data() : " << rv.data() << '\n' << "调用 base() : " << rv.base().size() << '\n' // ~> tv.size() << "范围循环 : "; for (const auto c : rv) std::cout << c; std::cout << '\n'; }
输出:
调用 empty(): false 调用 size() : 3 调用 begin(): c 调用 end() : s 调用 data() : cosmos 调用 base() : 3 范围循环 : cos
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| DR | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| P2325R3 | C++20 |
曾提供默认构造函数作为
view
必须满足
default_initializable
要求
|
随同该要求一并移除 |
参见
|
(C++11)
|
满足
CopyConstructible
与
CopyAssignable
要求的引用包装器
(类模板) |
|
(C++20)
|
对某个
range
具有独占所有权的
view
(类模板) |
|
(C++20)
|
包含
range
所有元素的
view
(别名模板) (范围适配器对象) |