可复制包装 (C++20)

来自cppreference.com
< cpp‎ | ranges
 
 
 
template<class T>

    requires std::copy_constructible<T> && std::is_object_v<T>

class /*copyable-box*/;
(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>

    : /*copyable-box*/(std::in_place) { }
(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 起)
1)std::copyable<T> 未得到实现,则复制赋值运算符等价地定义为:

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 的复制赋值运算符
2)std::movable<T> 未得到实现,则移动赋值运算符等价地定义为:

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 的移动赋值运算符

等同于 std::optional 的成员

成员函数

构造optional对象
(std::optional<T> 的公开成员函数)
销毁容纳的值,若存在
(std::optional<T> 的公开成员函数)
对内容赋值
(std::optional<T> 的公开成员函数)
观察器
访问所含值
(std::optional<T> 的公开成员函数)
检查对象是否含值
(std::optional<T> 的公开成员函数)
修改器
销毁任何所含值
(std::optional<T> 的公开成员函数)
原位构造所含值
(std::optional<T> 的公开成员函数)

注解

copyable-box 不含值,若

  • T 不实现 movablecopyable ,而分别在移动赋值或复制赋值时抛异常,或者
  • 从另一无值的包装初始化/赋值它。

P2325R3 前,该包装在标准中被称为 semiregular-box ,并且始终满足 semiregular ,因为始终提供默认构造函数(可能构造无值的包装)。

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
P2325R3 C++20 Tdefault_initializable 则默认构造函数构造不含值的包装 包装亦非 default_initializable
LWG 3572 C++20 条件性有别的赋值运算符不是 constexpr 使之为 constexpr

参阅

含有具有指定值的单个元素的 view
(类模板) (定制点对象)
range 中满足某个谓词的元素构成的 view
(类模板) (范围适配器对象)
对序列的每个元素应用某个变换函数的 view
(类模板) (范围适配器对象)
由另一 view 的到首个谓词返回 false 为止的起始元素组成的 view
(类模板) (范围适配器对象)
由另一 view 跳过元素的起始序列,直至首个谓词返回 false 的元素组成的 view
(类模板) (范围适配器对象)
由应用变换函数到被适配视图的对应元素的结果的元组组成的 view
(类模板) (定制点对象)
由应用变换函数到被适配视图的相邻元素的结果的元组组成的 view
(类模板) (范围适配器对象)