命名空間
變體
動作

std::experimental::propagate_const

出自 cppreference.com
 
 
實驗性
技術規範
檔案系統函式庫 (filesystem TS)
函式庫基礎 (library fundamentals TS)
函式庫基礎 2 (library fundamentals TS v2)
函式庫基礎 3 (library fundamentals TS v3)
平行化擴充 (parallelism TS)
平行化擴充 2 (parallelism TS v2)
並行化擴充 (concurrency TS)
並行化擴充 2 (concurrency TS v2)
概念 (concepts TS)
範圍 (ranges TS)
反射 (reflection TS)
數學特殊函數 (special functions TR)
實驗性非 TS
模式匹配
線性代數
std::execution
合約
2D 圖形
 
 
 
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

此外,Tconst 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* constvoid*const PtrLike 已禁止
English Deutsch 日本語 中文(简体) 中文(繁體)