class property specifiers (since C++26)
Указывает, что класс является заменяемым ( 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
является
заменяемым
, если он
подходит для замены
и выполняется одно из следующих условий:
- имеет replaceable_if_eligible class-prop-specifier
-
является
unionбез пользовательских специальных функций-членов - является default movable .
Право на замену
Класс
C
является
пригодным для замены
за исключением случаев, когда:
- у него есть базовый класс , который не является replaceable классом
- у него есть нестатический член данных , который не является replaceable типом
-
разрешение перегрузки завершается неудачей или выбирает удалённый конструктор при
прямой инициализации
объекта типа
Cиз xvalue типаC -
разрешение перегрузки завершается неудачей или выбирает удалённую функцию оператора присваивания при присваивании
lvalue
типа
Cиз xvalue типаC - у него есть удалённый деструктор .
Тривиальная перемещаемость
Класс является тривиально перемещаемым если он подходит для тривиального перемещения и выполняется одно из следующих условий:
- имеет trivially_relocatable_if_eligible class-prop-specifier
-
является
unionбез пользовательских специальных функций-членов - является default movable .
Критерии тривиального перемещения
Класс является подходящим для тривиального перемещения если он не имеет ни одного из следующих свойств:
- любая виртуальная базовый класс
- базовый класс, который не является тривиально перемещаемым классом
- нестатический элемент данных объектного типа, который не является тривиально перемещаемым типом
- удалённый деструктор
за исключением того, что определяется реализацией, является ли в остальном подходящий
union
с одним или несколькими подобъектами полиморфного типа класса
подходящим для тривиального перемещения
.
Дефолтная перемещаемость
Класс
C
является
перемещаемым по умолчанию
, если выполняются все следующие условия:
-
разрешение перегрузки для
прямой инициализации
объекта типа
Cиз xvalue типаCвыбирает конструктор, являющийся прямым членомCи не являющийся ни предоставленным пользователем, ни удалённым -
разрешение перегрузки для присваивания
lvalue
типа
Cиз xvalue типаCвыбирает функцию оператора присваивания, являющуюся прямым членомCи не являющуюся ни предоставленной пользователем, ни удалённой -
Cимеет деструктор , не являющийся ни предоставленным пользователем, ни удалённым.
Ключевые слова
final , replaceable_if_eligible , trivially_relocatable_if_eligible .
Примечание
- Не все TriviallyCopyable классы являются replaceable или trivially relocatable .
- Accessibility special member functions не учитывается при определении trivial relocatability или replaceability .
- Класс с константными или ссылочными non-static data members может быть trivially relocatable .
-
unions без пользовательских special member functions и default movable классы являются одновременно replaceable и trivially relocatable , даже если определены без спецификаторов свойств класса.
| Макрос проверки возможности | Значение | Стандарт | Возможность |
|---|---|---|---|
__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)
|
проверяет, является ли тип финальным классом
(шаблон класса) |