Пространства имён
Варианты
Действия

C++ именованные требования:StandardLayoutType(начиная с C++11)

Материал из cppreference.com
< cpp‎ | named req
 
 
Именованные требования в C++
Основные
Свойства типа
StandardLayoutType
(C++11)
В масштабах библиотеки
Контейнер
Элементы контейнера
(C++11)

Итератор
Потоковый Ввод/Вывод
Форматтеры
(C++20)
Случайные Числа
(C++11)    
Конкуренция
Диапазоны
Другое
(C++11)


 

Указывает, что тип имеет стандартную компоновку. Типы со стандартной компоновкой удобны при взаимодействии с кодом, написанном на другом языке.

Примечание: стандарт не определяет именованное требование с таким именем. Это категория типов, определяемая базовым языком. Оно включено здесь как именованное требование только для согласованности.

Содержание

[править]Требования

  • Все нестатичные методы класса имеют одинаковый контроль доступа
  • Не имеет виртуальных функций и виртуального базового класса
  • Не имеет нестатичных членов - ссылок.
  • Все нестатичные члены и базовые классы сами по себе имеют стандартную компоновку
  • Не имеет двух (возможно непрямых) базовых классов наследующих от одного и того-же типа
struct Q {};struct S : Q {};struct T : Q {};struct U : S, T {};// класс с нестандартной компоновкой: два базовых класса типа Q
  • Все нестатические элементы данных и битовые поля объявлены в одном классе (либо все в производном, либо все в некотором базовом)
struct B {int i;};// класс со стандартной компоновкойstruct C : B {};// класс со стандартной компоновкойstruct D : C {};// класс со стандартной компоновкойstruct E : D {char:4;};// класс с нестандартной компоновкой
  • Ни один из наследников базового класса не имеет того же типа, что
  • для не объединенных типов в качестве первого нестатического элемента данных (см. cpp/language/ebo) и, рекурсивно, первого нестатического элемента данных этого элемента данных, если он имеет тип класса, не являющийся объединением, или все нестатические элементы данных этого члена данных, если он имеет тип объединения, или элемент этого члена данных, если он имеет тип массива и т. д.
  • для типов объединения, как любые нестатические элементы данных, и, рекурсивно, первый нестатический элемент данных каждого члена типа класса, не являющегося объединением, и все нестатические элементы данных всех членов типа объединения, и тип элемента всех нестатических членов данных типа массива и т. д.
  • для типов массивов, как тип элемента массива и, рекурсивно, первый нестатический элемент данных элемента массива, если он имеет тип класса, не являющийся объединением, или как любой нестатический член данных элемента массива если он имеет тип объединения или как тип элемента элемента массива, если он имеет тип массива и т. д.

[править]Свойства

Смотри Стандартная компоновка.

[править]Отчеты о неисправностях

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
CWG 1672 C++11 first non-static data member rule ignored
existence of empty base classes
first non-static data member rule
made recursive
CWG 1813 C++11 класс, с членом, определенном в непрямом базовом классе
технически не имеют стандартной компоновки
все объявления типов должны быть
в одном классе
CWG 2120 C++11 массив как первый член класса не подразумевался когда
сравнительно с первым элементом с типом базового класса
члены массива подразумеваются

[править]Смотри также

проверяет, является ли тип типом со стандартной компоновкой
(шаблон класса)[править]
close