std::experimental::propagate_const
出自 cppreference.com
< cpp | experimental
| template< class T > class propagate_const; |
(Library Fundamentals TS v2) | |
std::experimental::propagate_const 是一個針對指標與指標類別物件的 const(常數)傳遞封裝器。當透過 const 存取路徑進行存取時,它會將封裝的指標視為指向 const 的指標,因此得名。
若底層的指標類別滿足對應需求,該類別滿足 MoveConstructible(可移動建構)與 MoveAssignable(可移動賦值)的要求,但 propagate_const 既非 CopyConstructible(可複製建構)亦非 CopyAssignable(可複製賦值)。
| 類型要求 | ||
-T 必須為 cv-未限定(cv-unqualified)的指標指向物件型別,或是下文指定的 cv-未限定指標類別型別。 |
目錄 |
[編輯] 指標類別型別的需求
若 T 為類別型別,則其必須滿足本小節中的需求。
給定
-
t為型別T的可修改 左值運算式, -
ct為型別 const T 的左值,且代表與t相同的物件(自 C++17 起等同於 std::as_const(t)), -
element_type為一種物件型別。
下列運算式必須有效並具有指定的效應:
| 表達式 | 回傳型別 | 前置條件 (Pre-conditions) | 操作語意 (Operational semantics) |
|---|---|---|---|
| t.get() | element_type* | ||
| ct.get() | element_type* 或 const element_type* | t.get() == ct.get() | |
| *t | element_type& | t.get() != nullptr | *t 指向與 *(t.get()) 相同的物件 |
| *ct | element_type& 或 const element_type& | ct.get() != nullptr | *ct 指向與 *(ct.get()) 相同的物件 |
| t.operator->() | element_type* | t.get() != nullptr | t.operator->() == t.get() |
| ct.operator->() | element_type* 或 const element_type* | ct.get() != nullptr | ct.operator->() == ct.get() |
| (bool)t | bool | (bool)t 等同於 t.get() != nullptr | |
| (bool)ct | bool | (bool)ct 等同於 ct.get() != nullptr |
此外,T 與 const T 應可語境轉換(contextually convertible)為 bool。
再者,若 T 可隱式轉換為 element_type*,則 (element_type*)t 應等於 t.get()。同理,若 const T 可隱式轉換為 const element_type*,則 (const element_type*)ct 應等於 ct.get()。
[編輯] 成員型別
| 成員型別 | 定義 |
| element_type | std::remove_reference_t<decltype(*std::declval<T&>())>,為 T 所指向之物件的型別 |
[編輯] 成員函式
建構一個新的 propagate_const(公開成員函式) | |
| (解構函式) (隱式宣告) |
解構 propagate_const,並銷毀包含的指標(公開成員函式) |
賦值 propagate_const 物件(公開成員函式) | |
| 交換封裝的指標 (公開成員函式) | |
觀察器 | |
| 返回指向封裝指標所指物件的指標 (公開成員函式) | |
| 檢查封裝的指標是否為空 (公開成員函式) | |
| 解引用(dereference)封裝的指標 (公開成員函式) | |
| 隱式轉換為指標的函式 (公開成員函式) | |
[編輯] 非成員函式
與另一個 propagate_const、另一個指標或 nullptr 進行比較(函式樣板) | |
特化 swap 演算法(函式樣板) | |
| 取得封裝之指標類別物件的參考 (函式樣板) |
[編輯] 輔助類別
為 propagate_const 提供雜湊支援(類別樣板特化) | |
為 propagate_const 特化的標準比較函式物件(類別樣板特化) |
[編輯] 範例
執行此程式碼
#include <experimental/propagate_const> #include <iostream> #include <memory> struct X { void g() const { std::cout << "X::g (const)\n"; } void g() { std::cout << "X::g (non-const)\n"; } }; struct Y { Y() : m_propConstX(std::make_unique<X>()), m_autoPtrX(std::make_unique<X>()) {} void f() const { std::cout << "Y::f (const)\n"; m_propConstX->g(); m_autoPtrX->g(); } void f() { std::cout << "Y::f (non-const)\n"; m_propConstX->g(); m_autoPtrX->g(); } std::experimental::propagate_const<std::unique_ptr<X>> m_propConstX; std::unique_ptr<X> m_autoPtrX; }; int main() { Y y; y.f(); const Y cy; cy.f(); }
輸出
Y::f (non-const) X::g (non-const) X::g (non-const) Y::f (const) X::g (const) X::g (non-const)
[編輯] 瑕疵報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 3136 | LFTSv2 | 允許無意義的 T,如 int* const、void* 或 const PtrLike |
已禁止 |