可賦值包裝器 (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 起) 以及儲存可呼叫物件的 Range Adaptor 都透過一個僅用於說明的類模板 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(/* 參見下文 */); |
(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 起) | |
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) | 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 ,由對適配檢視的相鄰元素應用轉換函式的結果組成(類模板) (範圍介面卡物件) |