Namespaces
Variants

std::experimental:: propagate_const

From cppreference.net
template < class T >
class propagate_const ;
(库基础技术规范 v2)

std::experimental::propagate_const 是一个用于指针和类指针对象的常量传播包装器。当通过常量访问路径访问时,它会将被包装的指针视为指向 const 的指针,因此得名。

该类满足 MoveConstructible MoveAssignable 的要求,前提是底层指针类型满足相应的要求,但 propagate_const 既不是 CopyConstructible 也不是 CopyAssignable

类型要求
-
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 对象
(公开成员函数)
(destructor)
(隐式声明)
销毁 propagate_const 对象,同时销毁所包含的指针
(公开成员函数)
赋值 propagate_const 对象
(公开成员函数)
交换包装的指针
(公开成员函数)
观察器
返回包装指针所指向对象的指针
(公开成员函数)
检查包装指针是否为空
(公开成员函数)
解引用包装指针
(公开成员函数)
到指针的隐式转换函数
(公开成员函数)

非成员函数

与另一个 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 禁止使用