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

Указывает, что класс является заменяемым ( replaceable_if_eligible ), тривиально перемещаемым ( trivially_relocatable_if_eligible ), или что от класса нельзя наследовать ( final ).

Содержание

Синтаксис

Спецификаторы свойств класса появляются в начале определения класса, сразу после имени класса, и не могут появляться в объявлении класса.

class-key attr  (необязательно) class-head-name class-prop-specifier-seq  (необязательно) base-clause  (необязательно)
class-prop-specifier-seq - один или несколько class-prop-specifier , но каждый может встречаться не более одного раза.
class-prop-specifier - один из final , replaceable_if_eligible и trivially_relocatable_if_eligible .

До (C++26) вместо class-prop-specifier-seq  (опционально) использовался class-virt-specifier  (опционально) , который допускал только final для final спецификатора (начиная с C++11) .

Объяснение

final , replaceable_if_eligible и trivially_relocatable_if_eligible являются идентификаторами со специальным значением при использовании в заголовке класса. В других контекстах они не зарезервированы и могут использоваться для именования объектов и функций.

final спецификатор

final указывает, что этот класс не может появляться в base-specifier-list другого определения класса (другими словами, не может быть унаследован). В противном случае программа некорректна (генерируется ошибка компиляции). final также может использоваться с определением union , в этом случае он не имеет эффекта (кроме влияния на результат std::is_final ) (since C++14) , поскольку объединения не могут быть унаследованы.

replaceable_if_eligible спецификатор

replaceable_if_eligible указывает, что этот класс является заменяемым  если он соответствует требованиям для замены  .

trivially_relocatable_if_eligible спецификатор

trivially_relocatable_if_eligible указывает, что данный класс является тривиально перемещаемым  если он соответствует критериям тривиального перемещения  .

Заменяемость

Класс C является заменяемым  , если он подходит для замены  и выполняется одно из следующих условий:

Право на замену

Класс C является пригодным для замены  за исключением случаев, когда:

Тривиальная перемещаемость

Класс является тривиально перемещаемым  если он подходит для тривиального перемещения  и выполняется одно из следующих условий:

Критерии тривиального перемещения

Класс является подходящим для тривиального перемещения  если он не имеет ни одного из следующих свойств:

за исключением того, что определяется реализацией, является ли в остальном подходящий union с одним или несколькими подобъектами полиморфного типа класса подходящим для тривиального перемещения  .

Дефолтная перемещаемость

Класс C является перемещаемым по умолчанию  , если выполняются все следующие условия:

  • разрешение перегрузки для прямой инициализации объекта типа C из xvalue типа C выбирает конструктор, являющийся прямым членом C и не являющийся ни предоставленным пользователем, ни удалённым
  • разрешение перегрузки для присваивания lvalue типа C из xvalue типа C выбирает функцию оператора присваивания, являющуюся прямым членом C и не являющуюся ни предоставленной пользователем, ни удалённой
  • C имеет деструктор , не являющийся ни предоставленным пользователем, ни удалённым.

Ключевые слова

final , replaceable_if_eligible , trivially_relocatable_if_eligible .

Примечание

Макрос проверки возможности Значение Стандарт Возможность
__cpp_trivial_relocatability 202502L (C++26) Тривиальная перемещаемость

Пример

struct final;      // OK; объявляет класс с именем 'final',
                   // не использует спецификаторы свойств класса.
struct IF final;   // Некорректно: спецификаторы свойств класса
                   // не могут появляться в объявлении функции.
struct F final {}; // OK; спецификатор помечает класс F как непроизводный.
struct D: F {};    // Некорректно: от класса F нельзя наследовать.
// OK; спецификатор помечает класс R как 𝘳𝘦𝘱𝘭𝘢𝘤𝘦𝘢𝘣𝘭𝘦 если соответствует требованиям.
struct R replaceable_if_eligible {};
// OK; спецификатор помечает класс T как 𝘵𝘳𝘪𝘷𝘪𝘢𝘭𝘭𝘺 𝘳𝘦𝘭𝘰𝘤𝘢𝘵𝘢𝘣𝘭𝘦 если соответствует требованиям.
struct T trivially_relocatable_if_eligible {};
// OK; класс может быть помечен несколькими спецификаторами свойств класса.
struct FRT final replaceable_if_eligible trivially_relocatable_if_eligible {};
// Некорректно: каждый спецификатор свойств класса может появляться не более одного раза.
struct FRF final replaceable_if_eligible final {};
int main() {}

Ссылки

  • Стандарт C++26 (ISO/IEC 14882:2026):
  • 6.8.1 Тривиально перемещаемые и заменяемые типы [basic.types.general]

Смотрите также

final спецификатор (C++11) объявляет, что метод не может быть переопределен или класс не может быть унаследован
(C++14)
проверяет, является ли тип финальным классом
(шаблон класса)