Namespaces
Variants

class property specifiers (since C++26)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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:

Elegibilidad para reemplazo

Una clase C es elegible para reemplazo a menos que:

Trivialidad de reubicación

Una clase es trivialmente reubicable  si es elegible para reubicación trivial  y cumple alguna de las siguientes condiciones:

Elegibilidad para reubicación trivial

Una clase es elegible para reubicación trivial  a menos que tenga alguna de las siguientes características:

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 C desde un xvalue de tipo C selecciona un constructor que es un miembro directo de C y no es ni user-provided ni deleted
  • la resolución de sobrecarga para asignar a un lvalue de tipo C desde un xvalue de tipo C selecciona una función de operador de asignación que es un miembro directo de C y no es ni user-provided ni deleted
  • C tiene un destructor que no es ni user-provided ni deleted.

Palabras clave

final , replaceable_if_eligible , trivially_relocatable_if_eligible .

Nota

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)