std::experimental:: propagate_const
|
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
|
禁止使用 |