名稱空間
變體
操作

可賦值包裝器 (C++20)

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
輔助項 (Helper items)
copyable-box
movable-box
(直到 C++23)  (C++23)


 
template< class T >

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

class /*copyable-box*/;
(C++20 起)
(直至 C++23)
(僅作說明*)
template< class T >

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

class /*movable-box*/;
(C++23 起)
(僅作說明*)

ranges::single_view, ranges::repeat_view,(C++23 起) 以及儲存可呼叫物件的 Range Adaptor 都透過一個僅用於說明的類模板 copyable-box(C++23 前)movable-box(C++23 起) 進行指定。此處顯示的名稱僅用於說明目的。

該包裝器的行為與 std::optional<T> 完全相同,但預設建構函式、複製賦值運算子和移動賦值運算子與 std::optional 的(有條件地)不同,這在需要時為 T 增加了可賦值性,並使其始終滿足 copyablemovable(C++23 起)

如果 T 已經 copyable,或者 std::is_nothrow_move_constructible_v<T>std::is_nothrow_copy_constructible_v<T> 都為 true,則 /*copyable-box*/<T> 可能只儲存一個 T 物件,因為它總是包含一個值。

(直至 C++23)

如果 T

/*movable-box*/<T> 可能只儲存一個 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>

    : /*copyable-box*/(std::in_place) { }
(C++20 起)
(直至 C++23)
constexpr /*movable-box*/() noexcept(std::is_nothrow_default_constructible_v<T>)

    requires std::default_initializable<T>

    : /*movable-box*/(std::in_place) { }
(C++23 起)

僅當 T 建模 default_initializable 時才提供預設建構函式。

預設構造的包裝器包含一個值初始化的 T 物件。

賦值運算子

(1)
constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other);
    noexcept(/* 參見下文 */);
(C++20 起)
(直至 C++23)
constexpr /*movable-box*/& operator=(const /*movable-box*/& other);
    noexcept(/* 參見下文 */) 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 起)
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;
}

(直至 C++23)

constexpr /*movable-box*/& operator=(const /*movable-box*/& other)
    noexcept(std::is_nothrow_copy_constructible_v<T>)
    requires std::copy_constructible<T>
{
    if (this != std::addressof(other))
        if (other)
            emplace(*other);
        else
            reset();

    return *this;
}

(C++23 起)
否則,它與 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;
}

(直至 C++23)

constexpr /*movable-box*/& operator=(/*movable-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;
}

(C++23 起)
否則,它與 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(C++23 前)movable-box(C++23 起) 僅在以下情況下不包含值:

  • T 不建模 movablecopyable,並且在移動賦值或複製賦值時分別丟擲異常,或
  • 它從另一個無值包裝器初始化/賦值。

P2325R3 之前,該包裝器在標準中稱為 semiregular-box,並且始終滿足 semiregular,因為總是提供預設建構函式(這可能會構造一個無值包裝器)。

特性測試 標準 特性
__cpp_lib_ranges 201911L (C++20) Ranges 庫受限演算法
202106L (C++20)
(DR)
不可預設初始化檢視
202207L (C++23) 放寬 Range Adaptor 以允許僅移動型別

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
P2325R3 C++20 如果 T 不是 default_initializable,則預設建構函式
構造一個不包含值的包裝器
該包裝器也
不可default_initializable
LWG 3572 C++20 有條件的賦值運算子不是 constexpr 已改為 constexpr

[編輯] 參見

一個包含單個指定值的 view
(類模板) (定製點物件)[編輯]
一個由重複生成相同值組成的view
(類模板) (定製點物件)[編輯]
一個 view,由滿足謂詞的 range 的元素組成
(類模板) (範圍介面卡物件)[編輯]
一個將轉換函式應用於每個元素的序列 view
(類模板) (範圍介面卡物件)[編輯]
一個 view,包含另一個 view 的初始元素,直到謂詞對第一個元素返回 false
(類模板) (範圍介面卡物件)[編輯]
一個 view,包含另一個 view 的元素,跳過初始元素子序列,直到謂詞對第一個元素返回 false
(類模板) (範圍介面卡物件)[編輯]
一個由轉換函式應用於適配檢視中對應元素的結果組成的 view
(類模板) (定製點物件)[編輯]
一個 view,由對適配檢視的相鄰元素應用轉換函式的結果組成
(類模板) (範圍介面卡物件)[編輯]