std::experimental::propagate_const
來自 cppreference.com
定義於標頭檔案 <experimental/propagate_const> |
||
template< class T > class propagate_const; |
(庫基礎 TS v2) | |
std::experimental::propagate_const
是一個對指標和類指標物件進行 const 傳播的包裝器。當透過 const
訪問路徑訪問時,它將包裝的指標視為指向 const
的指標,因此得名。
如果底層類指標型別滿足相應要求,則該類滿足 可移動構造 和 可移動賦值 的要求,但 propagate_const
既不是 可複製構造 也不是 可複製賦值 的。
型別要求 | ||
-T 必須是 cv-非限定指標到物件型別或 cv-非限定類指標型別,如下所述。 |
目錄 |
[編輯] 類指標型別的要求
如果 T
是類型別,則它必須滿足本小節中的要求。
給定
-
t
,一個型別為T
的可修改 左值表示式, -
ct
,一個型別為 const T 的左值,表示與t
相同的物件(等同於 C++17 起的 std::as_const(t)), -
element_type
,一個物件型別。
以下表達式必須有效並具有其指定的效果
表示式 | 返回型別 | 前置條件 | 操作語義 |
---|---|---|---|
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 應可上下文轉換為 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 (public 成員函式) | |
(解構函式) (隱式宣告) |
銷燬 propagate_const ,銷燬其中包含的指標(public 成員函式) |
賦值 propagate_const 物件(public 成員函式) | |
交換被包裝的指標 (public 成員函式) | |
觀察器 | |
返回指向被包裝指標所指向的物件的指標 (public 成員函式) | |
檢查被包裝的指標是否為空 (public 成員函式) | |
解引用被包裝的指標 (public 成員函式) | |
隱式轉換為指標的函式 (public 成員函式) |
[編輯] 非成員函式
與另一個 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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3136 | LFTSv2 | 允許使用無意義的 T 型別,如 int* const、void* 或 const PtrLike |
已停用 |