std::ranges:: views:: single, std::ranges:: single_view
|
定义于头文件
<ranges>
|
||
| (1) | ||
|
template
<
std::
copy_constructible
T
>
requires
std::
is_object_v
<
T
>
|
(C++20 起)
(C++23 前) |
|
|
template
<
std::
move_constructible
T
>
requires
std::
is_object_v
<
T
>
|
(C++23 起) | |
|
namespace
views
{
inline
constexpr
/* 未指定 */
single
=
/* 未指定 */
;
|
(2) | (C++20 起) |
|
调用签名
|
||
|
template
<
class
T
>
requires
/* 见下文 */
|
(C++20 起) | |
view
。
元素的生命周期与父级
single_view
绑定。复制
single_view
会同时创建该元素的副本。
目录 |
定制点对象
名称
views::single
表示一个
定制点对象
,这是一个常量
函数对象
,属于
字面量
的
semiregular
类类型。详情请参阅
定制点对象
。
数据成员
| 成员 | 定义 |
copyable-box
<T>
value_
(C++23 前)
|
视图的唯一元素
( 仅用于说明的成员对象* ) |
movable-box
<T>
value_
(C++23 起)
|
视图的唯一元素
( 仅用于说明的成员对象* ) |
成员函数
构造一个
single_view
(公开成员函数) |
|
|
返回指向元素的指针
(公开成员函数) |
|
|
返回指向元素末尾的指针
(公开成员函数) |
|
|
[static]
|
返回
false
(公开静态成员函数) |
|
[static]
|
返回
1
(公开静态成员函数) |
|
返回指向元素的指针
(公开成员函数) |
|
继承自 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::single_view:: single_view
|
single_view
(
)
requires
std::
default_initializable
<
T
>
=
default
;
|
(1) | (since C++20) |
| (2) | ||
|
constexpr
explicit
single_view
(
const
T
&
t
)
;
|
(since C++20)
(until C++23) |
|
|
constexpr
explicit
single_view
(
const
T
&
t
)
requires std:: copy_constructible < T > ; |
(since C++23) | |
|
constexpr
explicit
single_view
(
T
&&
t
)
;
|
(3) | (since C++20) |
|
template
<
class
...
Args
>
requires
std::
constructible_from
<
T, Args...
>
|
(4) | (since C++20) |
构造一个
single_view
。
value_
,这会值初始化其包含的值。
value_
。
value_
。
std::ranges::single_view:: begin
|
constexpr
T
*
begin
(
)
noexcept
;
constexpr const T * begin ( ) const noexcept ; |
(since C++20) | |
等价于 return data ( ) ; 。
std::ranges::single_view:: end
|
constexpr
T
*
end
(
)
noexcept
;
constexpr const T * end ( ) const noexcept ; |
(since C++20) | |
等价于 return data ( ) + 1 ; 。
std::ranges::single_view:: empty
|
static
constexpr
bool
empty
(
)
noexcept
;
|
(since C++20) | |
等价于 return false ; 。
std::ranges::single_view:: size
|
static
constexpr
std::
size_t
size
(
)
noexcept
;
|
(since C++20) | |
等价于 return 1 ; 。
使
single_view
满足
/*tiny-range*/
要求,该要求由
split_view
提出。
std::ranges::single_view:: data
|
constexpr
T
*
data
(
)
noexcept
;
constexpr const T * data ( ) const noexcept ; |
(since C++20) | |
返回指向
value_
所包含值的指针。若
value_
未包含值,则行为未定义。
推导指引
|
template
<
class
T
>
single_view ( T ) - > single_view < T > ; |
(C++20 起) | |
注释
对于
single_view
,继承的
empty
成员函数始终返回
false
,而继承的
operator
bool
转换函数始终返回
true
。
示例
#include <iomanip> #include <iostream> #include <ranges> #include <string> #include <tuple> int main() { constexpr std::ranges::single_view sv1{3.1415}; // 使用 (const T&) 构造函数 static_assert(sv1); static_assert(not sv1.empty()); std::cout << "1) *sv1.data(): " << *sv1.data() << '\n' << "2) *sv1.begin(): " << *sv1.begin() << '\n' << "3) sv1.size(): " << sv1.size() << '\n' << "4) distance: " << std::distance(sv1.begin(), sv1.end()) << '\n'; std::string str{"C++20"}; std::cout << "5) str = " << std::quoted(str) << '\n'; std::ranges::single_view sv2{std::move(str)}; // 使用 (T&&) 构造函数 std::cout << "6) *sv2.data(): " << std::quoted(*sv2.data()) << '\n' << "7) str = " << std::quoted(str) << '\n'; std::ranges::single_view<std::tuple<int, double, std::string>> sv3{std::in_place, 42, 3.14, "😄"}; // 使用 (std::in_place_t, Args&&... args) std::cout << "8) sv3 holds a tuple: { " << std::get<0>(sv3[0]) << ", " << std::get<1>(sv3[0]) << ", " << std::get<2>(sv3[0]) << " }\n"; }
输出:
1) *sv1.data(): 3.1415
2) *sv1.begin(): 3.1415
3) sv1.size(): 1
4) distance: 1
5) str = "C++20"
6) *sv2.data(): "C++20"
7) str = ""
8) sv3 holds a tuple: { 42, 3.14, 😄 }
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 修正后行为 |
|---|---|---|---|
| LWG 3428 | C++20 |
single_view
可从
std::in_place_t
转换
|
构造函数改为显式 |
| LWG 4035 | C++20 |
single_view
未提供成员函数
empty()
|
提供
empty()
|
| P2367R0 | C++20 |
single_view
的推导指引未能对实参进行退化处理;
views::single
复制但未包装
single_view
|
提供退化处理指引;
改为始终包装 |
参见
|
(C++17)
|
可容纳或可不容纳对象的包装器
(类模板) |
|
(C++20)
|
无元素的空
view
(类模板) (变量模板) |
|
(C++20)
|
通过分隔符拆分另一个
view
所获子范围的
view
(类模板) (范围适配器对象) |