std::experimental::propagate_const
| Defined in header <experimental/propagate_const>
|
||
template< class T > class propagate_const; |
(library fundamentals TS v2) | |
std::experimental::propagate_const is a const-propagating wrapper for pointers and pointer-like objects. It treats the wrapped pointer as a pointer to const when accessed through a const access path, hence the name.
The class satisfies the requirements of MoveConstructible and MoveAssignable if the underlying pointer-like type satisfies the corresponding requirement, but propagate_const is neither CopyConstructible nor CopyAssignable.
| Type requirements | ||
-T must be cv-unqualified pointer-to-object type or a cv-unqualified pointer-like class type, as specified below.
|
Requirements on pointer-like class types
If T is a class type, it must satisfy the requirements in this subsection.
Given
t, a modifiable lvalue expression of typeT,ct, an lvalue of typeconst Tthat denotes the same object ast(equivalent tostd::as_const(t)since C++17),element_type, an object type.
The following expressions must be valid and have their specified effects:
| Expression | Return type | Pre-conditions | Operational semantics |
|---|---|---|---|
t.get()
|
element_type*
|
||
ct.get()
|
element_type* or const element_type*
|
t.get() == ct.get()
| |
*t
|
element_type&
|
t.get() != nullptr
|
*t refers to the same object as *(t.get())
|
*ct
|
element_type& or const element_type&
|
ct.get() != nullptr
|
*ct refers to the same object as *(ct.get())
|
t.operator->()
|
element_type*
|
t.get() != nullptr
|
t.operator->() == t.get()
|
ct.operator->()
|
element_type* or const element_type*
|
ct.get() != nullptr
|
ct.operator->() == ct.get()
|
(bool)t
|
bool
|
(bool)t is equivalent to t.get() != nullptr
| |
(bool)ct
|
bool
|
(bool)ct is equivalent to ct.get() != nullptr
|
Further, T and const T shall be contextually convertible to bool.
In addition, if T is implicitly convertible to element_type*, then (element_type*)t shall be equal to t.get(). Similarly, if const T is implicitly convertible to const element_type*, then (const element_type*)ct shall be equal to ct.get().
Member types
| Member type | Definition |
element_type
|
std::remove_reference_t<decltype(*std::declval<T&>())>, the type of the object pointed to by T
|
Member functions
constructs a new propagate_const (public member function) | |
(destructor) (implicitly declared) |
destructs a propagate_const, destroying the contained pointer (public member function) |
assigns the propagate_const object (public member function) | |
| swaps the wrapped pointer (public member function) | |
Observers | |
| returns a pointer to the object pointed to by the wrapped pointer (public member function) | |
| checks if the wrapped pointer is null (public member function) | |
| dereferences the wrapped pointer (public member function) | |
| implicit conversion function to pointer (public member function) | |
Non-member functions
compares to another propagate_const, another pointer, or with nullptr (function template) | |
specializes the swap algorithm (function template) | |
| retrieves a reference to the wrapped pointer-like object (function template) |
Helper classes
hash support for propagate_const (class template specialization) | |
specializations of the standard comparison function objects for propagate_const (class template specialization) |
Example
#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();
}
Output:
Y::f (non-const)
X::g (non-const)
X::g (non-const)
Y::f (const)
X::g (const)
X::g (non-const)
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3136 | LFTSv2 | meaningless T like int* const, void*, or const PtrLike were allowed
|
disallowed |