std::experimental:: propagate_const
|
Definido en el encabezado
<experimental/propagate_const>
|
||
|
template
<
class
T
>
class propagate_const ; |
(library fundamentals TS v2) | |
std::experimental::propagate_const
es un contenedor que propaga constancia para punteros y objetos similares a punteros. Trata el puntero encapsulado como un puntero a
const
cuando se accede a través de una ruta de acceso
const
, de ahí su nombre.
La clase satisface los requisitos de
MoveConstructible
y
MoveAssignable
si el tipo subyacente similar a puntero satisface el requisito correspondiente, pero
propagate_const
no es
CopyConstructible
ni
CopyAssignable
.
| Requisitos de tipo | ||
-
T
debe ser un tipo puntero-a-objeto sin calificadores cv o un tipo de clase similar-a-puntero sin calificadores cv, como se especifica a continuación.
|
Contenidos |
Requisitos para tipos de clase similares a punteros
Si
T
es un tipo de clase, debe satisfacer los requisitos en esta subsección.
Dado
-
t, una expresión lvalue modificable de tipoT, -
ct, un lvalue de tipo const T que denota el mismo objeto quet(equivalente a std:: as_const ( t ) desde C++17), -
element_type, un tipo de objeto.
Las siguientes expresiones deben ser válidas y tener sus efectos especificados:
| Expresión | Tipo de retorno | Precondiciones | Semántica operacional |
|---|---|---|---|
| t. get ( ) | element_type * | ||
| ct. get ( ) | element_type * o const element_type * | t. get ( ) == ct. get ( ) | |
| * t | element_type & | t. get ( ) ! = nullptr | * t referencia al mismo objeto que * ( t. get ( ) ) |
| * ct | element_type & o const element_type & | ct. get ( ) ! = nullptr | * ct referencia al mismo objeto que * ( ct. get ( ) ) |
| t. operator - > ( ) | element_type * | t. get ( ) ! = nullptr | t. operator - > ( ) == t. get ( ) |
| ct. operator - > ( ) | element_type * o const element_type * | ct. get ( ) ! = nullptr | ct. operator - > ( ) == ct. get ( ) |
| ( bool ) t | bool | ( bool ) t es equivalente a t. get ( ) ! = nullptr | |
| ( bool ) ct | bool | ( bool ) ct es equivalente a ct. get ( ) ! = nullptr |
Además,
T
y
const
T
deberán ser contextualmente convertibles a
bool
.
Además, si
T
es implícitamente convertible a
element_type
*
, entonces
(
element_type
*
)
t
deberá ser igual a
t.
get
(
)
. Similarmente, si
const
T
es implícitamente convertible a
const
element_type
*
, entonces
(
const
element_type
*
)
ct
deberá ser igual a
ct.
get
(
)
.
Tipos de miembros
| Tipo de miembro | Definición |
| element_type |
std::
remove_reference_t
<
decltype
(
*
std::
declval
<
T
&
>
(
)
)
>
, el tipo del objeto apuntado por
T
|
Funciones miembro
construye un nuevo
propagate_const
(función miembro pública) |
|
|
(destructor)
(implicitly declared)
|
destruye un
propagate_const
, eliminando el puntero contenido
(función miembro pública) |
asigna el objeto
propagate_const
(función miembro pública) |
|
|
intercambia el puntero encapsulado
(función miembro pública) |
|
Observadores |
|
|
devuelve un puntero al objeto apuntado por el puntero encapsulado
(función miembro pública) |
|
|
comprueba si el puntero encapsulado es nulo
(función miembro pública) |
|
|
desreferencia el puntero encapsulado
(función miembro pública) |
|
|
función de conversión implícita a puntero
(función miembro pública) |
|
Funciones no miembro
compara con otro
propagate_const
, otro puntero, o con
nullptr
(plantilla de función) |
|
especializa el algoritmo
swap
(plantilla de función) |
|
|
obtiene una referencia al objeto similar a puntero encapsulado
(plantilla de función) |
Clases auxiliares
soporte de hash para
propagate_const
(especialización de plantilla de clase) |
|
especializaciones de los objetos de función de comparación estándar para
propagate_const
(especialización de plantilla de clase) |
Ejemplo
#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(); }
Salida:
Y::f (non-const) X::g (non-const) X::g (non-const) Y::f (const) X::g (const) X::g (non-const)
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3136 | LFTSv2 |
se permitían tipos
T
sin sentido como
int
*
const
,
void
*
, o
const
PtrLike
|
no permitido |