命名空间
变体
操作

std::experimental::propagate_const

来自 cppreference.com
 
 
实验性
技术规范
文件系统库 (文件系统 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 访问路径访问时,因此得名。

如果基础指针类类型满足相应要求,则该类满足 MoveConstructibleMoveAssignable 的要求,但 propagate_const 既不是 CopyConstructible 也不是 CopyAssignable

类型要求
-
T 必须是 cv 无限定的指向对象的指针类型或 cv 无限定的类似指针的类类型,如下所述。

内容

[编辑] 类似指针的类类型的要求

如果 T 是类类型,则它必须满足本节中的要求。

给定

  • tT 类型可修改的 左值表达式
  • ctconst T 类型的左值,表示与 t 相同的对象(等效于 std::as_const(t),自 C++17 起),
  • 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
(公共成员函数) [编辑]
(析构函数)
(隐式声明)
析构一个 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* constvoid*const PtrLike 被允许 不允许