可赋值包装 (C++20)
template<class
T>
requires std::copy_constructible<T>
&&
std::is_object_v<T> |
(C++20
起) (C++23 前) |
|
template<class
T>
requires std::move_constructible<T>
&&
std::is_object_v<T> |
(C++23 起) | |
ranges::single_view、 ranges::repeat_view
(C++23
起)
以及存储一个可调用对象的范围适配器通过仅用于阐释的类模板 copyable-box
(C++23
前)movable-box
(C++23
起) 说明。此处显示的名字仅用于阐释目的。
该包装行为准确地与 std::optional<T>
相同,除了默认构造函数、复制赋值运算符与移动赋值运算符(条件性地)异于 std::optional
。这在需要时为 T
增设赋值能力,并使得包装始终满足 copyable
或 movable
(C++23
起)。
若 |
(C++23 前) |
若
则 /*movable-box*/<T>
可以仅存储一个 |
(C++23 起) |
模板形参
T | - | 被含有值的类型,必须为实现 copy_constructible
(C++23
前)move_constructible
(C++23
起) 的对象类型
|
成员函数
默认构造函数
constexpr
/*copyable-box*/()
noexcept(std::is_nothrow_default_constructible_v<T>)
requires std::default_initializable<T> |
(C++20
起) (C++23 前) |
|
constexpr
/*movable-box*/()
noexcept(std::is_nothrow_default_constructible_v<T>)
requires std::default_initializable<T> |
(C++23 起) | |
当且仅当 T
实现 default_initializable
才提供默认构造函数。
默认构造的包装含有值初始化的 T
对象。
赋值运算符
(1) | ||
constexpr
/*copyable-box*/&
operator=(const
/*copyable-box*/&
other);
noexcept(/* see below */); |
(C++20
起) (C++23 前) |
|
constexpr
/*movable-box*/&
operator=(const
/*movable-box*/&
other);
noexcept(/* see below */) requires std::copy_constructible<T>; |
(C++23 起) | |
(2) | ||
constexpr
/*copyable-box*/&
operator=(/*copyable-box*/&&
other)
noexcept(std::is_nothrow_move_constructible_v<T>); |
(C++20
起) (C++23 前) |
|
constexpr
/*movable-box*/&
operator=(/*movable-box*/&&
other)
noexcept(std::is_nothrow_move_constructible_v<T>); |
(C++23 起) | |
constexpr
/*copyable-box*/&
operator=(const
/*copyable-box*/&
other) |
(C++23 前) |
constexpr
/*movable-box*/&
operator=(const
/*movable-box*/&
other) |
(C++23 起) |
std::optional
的复制赋值运算符。
constexpr
/*copyable-box*/&
operator=(/*copyable-box*/&&
other) |
(C++23 前) |
constexpr
/*movable-box*/&
operator=(/*movable-box*/&&
other) |
(C++23 起) |
std::optional
的移动赋值运算符。
注解
若下列条件成立 copyable-box
(C++23
前)movable-box
(C++23
起) 则不含值,若
在 P2325R3 前,该包装在标准中被称为
semiregular-box
,并且始终满足 semiregular
,因为始终提供默认构造函数(可能构造无值的包装)。
功能特性测试宏 | 值 | 标准 | 注释 |
---|---|---|---|
__cpp_lib_ranges
|
201911L | (C++20) | 范围库与受约束算法 |
202106L | (C++20) (DR) |
非可默认初始化的视图 | |
202207L | (C++23) | 放松范围适配器以允许仅移动类型 |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
P2325R3 | C++20 | 若 T 非 default_initializable
则默认构造函数构造不含值的包装
|
包装亦非 default_initializable
|
LWG 3572 | C++20 | 条件性有别的赋值运算符不是 constexpr | 使之为 constexpr |
参阅
(C++20)
|
含有具有指定值的单个元素的 view
(类模板) (定制点对象) |
(C++23)
|
由重复产出同一值生成的序列组成的 view
(类模板) (定制点对象) |
(C++20)
|
由 range
中满足某个谓词的元素构成的 view
(类模板) (范围适配器对象) |
对序列的每个元素应用某个变换函数的 view
(类模板) (范围适配器对象) |
|
由另一 view
的到首个谓词返回 false 为止的起始元素组成的 view
(类模板) (范围适配器对象) |
|
由另一 view
跳过元素的起始序列,直至首个谓词返回 false 的元素组成的 view
(类模板) (范围适配器对象) |
|
由应用变换函数到被适配视图的对应元素的结果的元组组成的 view
(类模板) (定制点对象) |
|
由应用变换函数到被适配视图的相邻元素的结果的元组组成的 view
(类模板) (范围适配器对象) |