可复制包装 (C++20)
template<class T> requires std::copy_constructible<T> && std::is_object_v<T> |
(C++20 起) | |
ranges::single_view 与存储一个可调用对象的范围适配器通过仅用于阐释的类模板 copyable-box
说明。名称 copyable-box
仅用于阐释目的。
/*copyable-box*/<T> 行为准确同 std::optional<T> ,除了默认构造函数、复制赋值运算符与移动赋值运算符(条件性地)异于 std::optional 的,这使得它始终满足 copyable
。
若 T
已为 copyable
,或 std::is_nothrow_move_constructible_v<T> 与 std::is_nothrow_copy_constructible_v<T> 均为 true ,则 /*copyable-box*/<T> 可以只存储一个 T
对象,因为它始终含值。
模板形参
T | - | 被含有值的类型,必须为实现 copy_constructible 的对象类型
|
成员函数
copyable-box::copyable-box
constexpr /*copyable-box*/() noexcept(std::is_nothrow_default_constructible_v<T>) requires std::default_initializable<T> |
(C++20 起) | |
当且仅当 T
实现 default_initializable
才提供默认构造函数。
默认构造的 /*copyable-box*/<T> 含有值初始化的 T
对象。
copyable-box::operator=
constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other); noexcept(/* see below */); |
(1) | (C++20 起) |
constexpr /*copyable-box*/& operator=(/*copyable-box*/&& other) noexcept(std::is_nothrow_move_constructible_v<T>); |
(2) | (C++20 起) |
constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other)
noexcept(std::is_nothrow_copy_constructible_v<T>)
{
if (this != std::addressof(other)) {
if (other) emplace(*other);
else reset();
}
return *this;
}
std::optional
的复制赋值运算符。constexpr /*copyable-box*/& operator=(/*copyable-box*/&& other)
noexcept(std::is_nothrow_move_constructible_v<T>)
{
if (this != std::addressof(other)) {
if (other) emplace(std::move(*other));
else reset();
}
return *this;
}
std::optional
的移动赋值运算符。注解
copyable-box
不含值,若
在 P2325R3 前,该包装在标准中被称为 semiregular-box
,并且始终满足 semiregular
,因为始终提供默认构造函数(可能构造无值的包装)。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
P2325R3 | C++20 | 若 T 非 default_initializable 则默认构造函数构造不含值的包装
|
包装亦非 default_initializable
|
LWG 3572 | C++20 | 条件性有别的赋值运算符不是 constexpr | 使之为 constexpr |
参阅
含有具有指定值的单个元素的 view (类模板) (定制点对象) | |
由 range 中满足某个谓词的元素构成的 view (类模板) (范围适配器对象) | |
对序列的每个元素应用某个变换函数的 view (类模板) (范围适配器对象) | |
由另一 view 的到首个谓词返回 false 为止的起始元素组成的 view (类模板) (范围适配器对象) | |
由另一 view 跳过元素的起始序列,直至首个谓词返回 false 的元素组成的 view (类模板) (范围适配器对象) | |
由应用变换函数到被适配视图的对应元素的结果的元组组成的 view (类模板) (定制点对象) | |
由应用变换函数到被适配视图的相邻元素的结果的元组组成的 view (类模板) (范围适配器对象) |