class property specifiers (since C++26)
Especifica que una clase es reemplazable ( replaceable_if_eligible ), trivialmente reubicable ( trivially_relocatable_if_eligible ), o que una clase no puede ser derivada ( final ).
Contenidos |
Sintaxis
Especificadores de propiedades de clase aparecen al comienzo de la definición de la clase, inmediatamente después del nombre de la clase, y no pueden aparecer en una declaración de clase.
| class-key attr (opcional) class-head-name class-prop-specifier-seq (opcional) base-clause (opcional) | |||||||||
| class-prop-specifier-seq | - | uno o más class-prop-specifier s, pero cada uno puede aparecer como máximo una vez. |
| class-prop-specifier | - | uno de final , replaceable_if_eligible y trivially_relocatable_if_eligible . |
Antes de
(C++26)
, existía el
class-virt-specifier
(opcional)
en lugar de
class-prop-specifier-seq
(opcional)
, que solo permitía el
final
para
final
especificador
(desde C++11)
.
Explicación
final , replaceable_if_eligible y trivially_relocatable_if_eligible son identificadores con un significado especial cuando se utilizan en la cabecera de una clase. En otros contextos, no están reservados y pueden utilizarse para nombrar objetos y funciones.
final especificador
final especifica que esta clase no puede aparecer en la base-specifier-list de otra definición de clase (en otras palabras, no puede ser derivada). El programa está mal formado en caso contrario (se genera un error en tiempo de compilación). final también puede usarse con una definición de union , en cuyo caso no tiene efecto (aparte del resultado de std::is_final ) (desde C++14) , ya que las uniones no pueden ser derivadas.
replaceable_if_eligible especificador
replaceable_if_eligible especifica que esta clase es reemplazable si es elegible para reemplazo .
trivially_relocatable_if_eligible especificador
trivially_relocatable_if_eligible especifica que esta clase es trivialmente reubicable si es elegible para reubicación trivial .
Reemplazabilidad
Una clase
C
es
reemplazable
si es
elegible para reemplazo
y cumple alguna de las siguientes condiciones:
- tiene el replaceable_if_eligible class-prop-specifier
-
es una
unionsin funciones miembro especiales declaradas por el usuario - es default movable .
Elegibilidad para reemplazo
Una clase
C
es
elegible para reemplazo
a menos que:
- tiene una clase base que no es una replaceable class
- tiene un non-static data member que no es de un replaceable type
-
la resolución de sobrecarga falla o selecciona un constructor eliminado cuando se
direct-initializing
un objeto de tipo
Cdesde un xvalue de tipoC -
la resolución de sobrecarga falla o selecciona una función de operador de asignación eliminada cuando se asigna a un
lvalue
de tipo
Cdesde un xvalue de tipoC - tiene un deleted destructor .
Trivialidad de reubicación
Una clase es trivialmente reubicable si es elegible para reubicación trivial y cumple alguna de las siguientes condiciones:
- tiene el trivially_relocatable_if_eligible class-prop-specifier
-
es una
unionsin funciones miembro especiales declaradas por el usuario - es movible por defecto .
Elegibilidad para reubicación trivial
Una clase es elegible para reubicación trivial a menos que tenga alguna de las siguientes características:
- cualquier clase base virtual
- una clase base que no sea una clase trivialmente reubicable
- un miembro de datos no estático de tipo objeto que no sea de un tipo trivialmente reubicable
- un destructor eliminado
excepto que es definido por la implementación si una
union
que de otro modo sería elegible y que tiene uno o más subobjetos de tipo de clase polimórfica es
elegible para reubicación trivial
.
Movilidad por defecto
Una clase
C
es
default movable
si se cumplen todas las siguientes condiciones:
-
la resolución de sobrecarga para
direct-initializing
un objeto de tipo
Cdesde un xvalue de tipoCselecciona un constructor que es un miembro directo deCy no es ni user-provided ni deleted -
la resolución de sobrecarga para asignar a un
lvalue
de tipo
Cdesde un xvalue de tipoCselecciona una función de operador de asignación que es un miembro directo deCy no es ni user-provided ni deleted -
Ctiene un destructor que no es ni user-provided ni deleted.
Palabras clave
final , replaceable_if_eligible , trivially_relocatable_if_eligible .
Nota
- No todas las TriviallyCopyable son reemplazables o trivialmente reubicables .
- La accesibilidad de las funciones miembro especiales no se considera al establecer la reubicabilidad trivial o la reemplazabilidad .
- Una clase con miembros de datos no estáticos calificados como const o de tipo referencia puede ser trivialmente reubicable .
-
Las
unions sin funciones miembro especiales declaradas por el usuario y las clases movibles por defecto son tanto reemplazables como trivialmente reubicables , incluso cuando se definen sin especificadores de propiedades de clase.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_trivial_relocatability
|
202502L
|
(C++26) | Trivial relocatability |
Ejemplo
struct final; // OK; declara una clase llamada 'final', // no utiliza especificadores de propiedad de clase. struct IF final; // Mal formado: los especificadores de propiedad de clase // no pueden aparecer en declaraciones de función. struct F final {}; // OK; el especificador marca la clase F como no derivable. struct D: F {}; // Mal formado: no se puede derivar de la clase F. // OK; el especificador marca la clase R como 𝘳𝘦𝘦𝘮𝘱𝘭𝘢𝘻𝘢𝘣𝘭𝘦 si es elegible. struct R replaceable_if_eligible {}; // OK; el especificador marca la clase T como 𝘵𝘳𝘪𝘷𝘪𝘢𝘭𝘮𝘦𝘯𝘵𝘦 𝘳𝘦𝘶𝘣𝘪𝘤𝘢𝘣𝘭𝘦 si es elegible. struct T trivially_relocatable_if_eligible {}; // OK; una clase puede marcarse con múltiples especificadores de propiedad de clase. struct FRT final replaceable_if_eligible trivially_relocatable_if_eligible {}; // Mal formado: cada especificador de propiedad de clase puede aparecer como máximo una vez. struct FRF final replaceable_if_eligible final {}; int main() {}
Referencias
- Estándar C++26 (ISO/IEC 14882:2026):
-
- 6.8.1 Tipos trivialmente reubicables y reemplazables [basic.types.general]
Véase también
final
especificador
(C++11)
|
declara que un método no puede ser sobrescrito o que una clase no puede ser derivada |
|
(C++14)
|
verifica si un tipo es un tipo de clase final
(plantilla de clase) |