可复制包装 (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
(类模板) (范围适配器对象) [编辑]