C++ 命名要求: MoveInsertable (C++11 起)
來自 cppreference.com
指定給定分配器可將該型別的物件從該型別的右值構造到未初始化的儲存中。
目錄 |
[編輯] 要求
給定以下型別、值和表示式
型別 | 定義 |
T
|
一個物件型別 |
A
|
一個分配器型別 |
X
|
一個滿足以下所有條件的容器型別
|
值 | 定義 |
m | 一個型別為 A 的左值 |
p | 一個型別為 T* 的指標 |
表示式 | 定義 |
rv | 表示型別 T 的右值的表示式 |
expr | std::allocator_traits<A>::construct(m, p, rv) |
如果滿足以下所有條件,則 T
可 MoveInsertable 到 X
中
- expr 格式良好。
- 在求值 expr 之後,*p 的值等同於求值之前 rv 的值。
[編輯] 注意
如果 A
是 std::allocator<T>,則這將呼叫 placement new,如 ::new((void*)p) T(rv)(C++20 前)std::construct_at(p, rv)(C++20 起)。這實際上要求 T
是可移動構造的。
如果使用 std::allocator<T> 或類似的分配器,一個類不必實現 移動建構函式 來滿足此型別要求:接受 const T& 引數的 複製建構函式 可以繫結右值表示式。如果一個 MoveInsertable 類實現了一個移動建構函式,它也可以實現 移動語義,以利用構造後 rv
的值未指定的事實。
雖然要求在 C++23 之前構造 std::basic_string 的元素時使用自定義的 construct
,但所有實現都只使用了預設機制。該要求已透過 P1072R10 進行更正,以符合現有實踐。
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2177 | C++11 | 求值 expr 沒有後置條件 | 已新增 |
[編輯] 參閱
CopyInsertable(可複製插入) |