Namespaces
Variants
Actions

class property specifiers (since C++26)

From cppreference.com
< cpp‎ | language
 
 
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
 
 

Specifies that a class is replaceable  (replaceable_if_eligible), trivially relocatable  (trivially_relocatable_if_eligible), or that a class cannot be derived from (final).

Contents

[edit]Syntax

Class property specifiers appear at the beginning of the class definition, immediately after the name of the class, and cannot appear in a class declaration.

class-keyattr (optional)class-head-nameclass-prop-specifier-seq (optional)base-clause (optional)
class-prop-specifier-seq - one or more class-prop-specifier s, but each can appear at most once.
class-prop-specifier - one of final, replaceable_if_eligible and trivially_relocatable_if_eligible.

Before (C++26), there was the class-virt-specifier (optional) in place of class-prop-specifier-seq (optional), which only allowed the final for final specifier(since C++11).

[edit]Explanation

final, replaceable_if_eligible and trivially_relocatable_if_eligible are identifiers with a special meaning when used in a class head. In other contexts, it is not reserved and may be used to name objects and functions.

[edit]final specifier

final specifies that this class may not appear in the base-specifier-list of another class definition (in other words, cannot be derived from). The program is ill-formed otherwise (a compile-time error is generated). final can also be used with a union definition, in which case it has no effect (other than on the outcome of std::is_final)(since C++14), since unions cannot be derived from.

[edit]replaceable_if_eligible specifier

replaceable_if_eligible specifies that this class is replaceable  if it is eligible for replacement .

[edit]trivially_relocatable_if_eligible specifier

trivially_relocatable_if_eligible specifies that this class is trivially relocatable  if it is eligible for trivial relocation .

[edit]Replaceability

A class C is replaceable  if it is eligible for replacement  and either:

[edit]Eligibility for replacement

A class C is eligible for replacement  unless either:

[edit]Trivial relocatability

A class is trivially relocatable  if it is eligible for trivial relocation  and either:

[edit]Eligibility for trivial relocation

A class is eligible for trivial relocation  unless it has either:

except that it is implementation-defined whether an otherwise-eligible union having one or more subobjects of polymorphic class type is eligible for trivial relocation .

[edit]Default movability

A class C is default movable  if all following conditions are met:

  • overload resolution for direct-initializing an object of type C from an xvalue of type C selects a constructor that is a direct member of C and is neither user-provided nor deleted
  • overload resolution for assigning to an lvalue of type C from an xvalue of type C selects an assignment operator function that is a direct member of C and is neither user-provided nor deleted
  • C has a destructor that is neither user-provided nor deleted.

[edit]Keywords

final, replaceable_if_eligible, trivially_relocatable_if_eligible.

[edit]Note

Feature-test macroValueStdFeature
__cpp_trivial_relocatability202502L(C++26)Trivial relocatability

[edit]Example

struct final;// OK; declares a class named 'final',// does not use class property specifiers.struct IF final;// Ill-formed: class property specifiers// cannot appear at function declaration.struct F final {};// OK; specifier marks class F as non-derivable.struct D: F {};// Ill-formed: class F cannot be derived from.   // OK; specifier marks class R as 𝘳𝘦𝘱𝘭𝘢𝘤𝘦𝘢𝘣𝘭𝘦 if eligible.struct R replaceable_if_eligible {};   // OK; specifier marks class T as 𝘵𝘳𝘪𝘷𝘪𝘢𝘭𝘭𝘺 𝘳𝘦𝘭𝘰𝘤𝘢𝘵𝘢𝘣𝘭𝘦 if eligible.struct T trivially_relocatable_if_eligible {};   // OK; a class can be marked with multiple class property specifiers.struct FRT final replaceable_if_eligible trivially_relocatable_if_eligible {};   // Ill-formed: each class property specifier can appear at most once.struct FRF final replaceable_if_eligible final {};   int main(){}

[edit]References

  • C++26 standard (ISO/IEC 14882:2026):
  • 6.8.1 Trivially relocatable and replaceable types [basic.types.general]

[edit]See also

final specifier(C++11) declares that a method cannot be overridden or a class be derived from[edit]
(C++14)
checks if a type is a final class type
(class template)[edit]
close