std::ranges:: owning_view
|
定义于头文件
<ranges>
|
||
|
template
<
ranges::
range
R
>
requires
std::
movable
<
R
>
&&
(
!
/*is-initializer-list*/
<
R
>
)
|
(C++20 起) | |
owning_view
是一个拥有对
view
唯一所有权的
range
。它是仅移动类型,并将该
range
存储于其内部。
requires 子句中的常量 /*is-initializer-list*/ < R > 为 true 当且仅当 std:: remove_cvref_t < R > 是 std::initializer_list 的特化。
数据成员
| 成员 | 描述 |
R
r_
|
底层范围
( 仅用于说明的成员对象* ) |
成员函数
通过值初始化或移动构造存储的范围来构造
owning_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::owning_view:: owning_view
|
owning_view
(
)
requires
std::
default_initializable
<
R
>
=
default
;
|
(1) | (since C++20) |
|
owning_view
(
owning_view
&&
other
)
=
default
;
|
(2) | (since C++20) |
|
constexpr
owning_view
(
R
&&
t
)
;
|
(3) | (since C++20) |
参数
| other | - |
要从中移动的另一个
owning_view
|
| t | - | 要从中移动的范围 |
注解
owning_view
未显式定义拷贝构造函数。
owning_view
是仅移动类型。
std::ranges::owning_view:: operator=
|
owning_view
&
operator
=
(
owning_view
&&
other
)
=
default
;
|
(since C++20) | |
移动赋值运算符。将
other
的
r_
移动赋值给当前对象。
参数
| other | - |
要从中移动的另一个
owning_view
|
返回值
* this
备注
owning_view
未显式定义拷贝赋值运算符。
owning_view
是仅移动类型。
std::ranges::owning_view:: base
|
constexpr
R
&
base
(
)
&
noexcept
;
|
(1) | (since C++20) |
|
constexpr
const
R
&
base
(
)
const
&
noexcept
;
|
(2) | (since C++20) |
|
constexpr
R
&&
base
(
)
&&
noexcept
;
|
(3) | (since C++20) |
|
constexpr
const
R
&&
base
(
)
const
&&
noexcept
;
|
(4) | (since C++20) |
返回存储范围的引用,保持值类别和常量限定性。
返回值
r_
r_
)
std::ranges::owning_view:: begin
|
constexpr
ranges::
iterator_t
<
R
>
begin
(
)
;
|
(1) | (since C++20) |
|
constexpr
auto
begin
(
)
const
requires
ranges::
range
<
const
R
>
;
|
(2) | (since C++20) |
返回
ranges::
begin
(
r_
)
。
std::ranges::owning_view:: end
|
constexpr
ranges::
sentinel_t
<
R
>
end
(
)
;
|
(1) | (since C++20) |
|
constexpr
auto
end
(
)
const
requires
ranges::
range
<
const
R
>
;
|
(2) | (since C++20) |
返回
ranges::
end
(
r_
)
。
std::ranges::owning_view:: empty
|
constexpr
bool
empty
(
)
requires requires
{
ranges::
empty
(
r_
)
;
}
;
|
(1) | (since C++20) |
|
constexpr
bool
empty
(
)
const
requires requires
{
ranges::
empty
(
r_
)
;
}
;
|
(2) | (since C++20) |
返回
ranges::
empty
(
r_
)
。
std::ranges::owning_view:: size
|
constexpr
auto
size
(
)
requires
ranges::
sized_range
<
R
>
;
|
(1) | (since C++20) |
|
constexpr
auto
size
(
)
const
requires
ranges::
sized_range
<
const
R
>
;
|
(2) | (since C++20) |
返回
ranges::
size
(
r_
)
。
std::ranges::owning_view:: reserve_hint
|
constexpr
auto
reserve_hint
(
)
requires ranges :: approximately_sized_range < R > ; |
(1) | (since C++26) |
|
constexpr
auto
reserve_hint
(
)
const
requires ranges :: approximately_sized_range < const R > ; |
(2) | (since C++26) |
返回
ranges
::
reserve_hint
(
r_
)
。
std::ranges::owning_view:: data
|
constexpr
auto
data
(
)
requires
ranges::
contiguous_range
<
R
>
;
|
(1) | (since C++20) |
|
constexpr
auto
data
(
)
const
requires
ranges::
contiguous_range
<
const
R
>
;
|
(2) | (since C++20) |
返回
ranges::
data
(
r_
)
。
辅助模板
|
template
<
class
T
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
owning_view
<
T
>>
=
|
(C++20 起) | |
此
ranges::
enable_borrowed_range
的特化使得
owning_view
在底层范围满足
borrowed_range
时同样满足该概念。
注释
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) |
ranges::approximately_sized_range
和
reserve_hint
|
示例
#include <cassert> #include <iostream> #include <ranges> #include <string> int main() { using namespace std::literals; std::ranges::owning_view ov{"cosmos"s}; // 推导出的 R 类型为 std::string; // “ov” 是该字符串的唯一所有者 assert( ov.empty() == false && ov.size() == 6 && ov.size() == ov.base().size() && ov.front() == 'c' && ov.front() == *ov.begin() && ov.back() == 's' && ov.back() == *(ov.end() - 1) && ov.data() == ov.base() ); std::cout << "sizeof(ov): " << sizeof ov << '\n' // 通常等于 sizeof(R) << "range-for: "; for (const char ch : ov) std::cout << ch; std::cout << '\n'; std::ranges::owning_view<std::string> ov2; assert(ov2.empty()); // ov2 = ov; // 编译时错误:复制赋值运算符已被删除 ov2 = std::move(ov); // 正确 assert(ov2.size() == 6); }
可能的输出:
sizeof(ov): 32 range-for: cosmos
参见
|
(C++20)
|
某个其他
range
元素的
view
(类模板) |
|
(C++20)
|
包含
range
所有元素的
view
(别名模板) (范围适配器对象) |