名稱空間
變體
操作

std::experimental::propagate_const

來自 cppreference.com
< cpp‎ | 實驗性
 
 
實驗性
技術規範
檔案系統庫 (檔案系統 TS)
庫基礎 (庫基礎 TS)
庫基礎 2 (庫基礎 TS v2)
庫基礎 3 (庫基礎 TS v3)
並行性擴充套件 (並行性 TS)
並行性擴充套件 2 (並行性 TS v2)
併發性擴充套件 (併發性 TS)
併發擴充套件 2 (併發 TS v2)
概念 (概念 TS)
範圍 (範圍 TS)
反射 (反射 TS)
數學特殊函式 (特殊函式 TR)
實驗性非 TS
模式匹配
線性代數
std::execution
契約
2D 圖形
 
 
 
定義於標頭檔案 <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

此外,Tconst 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* constvoid*const PtrLike 已停用