class property specifiers (since C++26)

From cppreference.net
< cpp‎ | language
 
 
C++ language
General topics
Flow control
Conditional execution statements
if
Iteration statements (loops)
for
range-for (C++11)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications (until C++17*)
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
const/volatile
decltype (C++11)
auto (C++11)
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
explicit (C++11)
static

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).

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-key attr (optional) class-head-name class-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).

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.

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.

replaceable_if_eligible specifier

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

trivially_relocatable_if_eligible specifier

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

Replaceability

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

Eligibility for replacement

A class C is eligible for replacement  unless either:

Trivial relocatability

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

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 .

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.

Keywords

final, replaceable_if_eligible, trivially_relocatable_if_eligible.

Note

Feature-test macro Value Std Feature
__cpp_trivial_relocatability 202502L (C++26) Trivial relocatability

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() {}

References

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

See also

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