У C ++ 20 поняття POD є застарілим, нібито тому, що це безглузда складна риса тривіальності та стандартного макета.
Неправильно. Термін POD застаряє, оскільки це вже не має значення :
Термін POD більше не служить цілі в стандарті, він просто визначений, і обмеження застосовуються, коли кілька інших типів зберігають цю вестигіальну властивість.
По суті, тип, який є і тривіальним, і стандартним макетом, не отримує ніяких здібностей, крім того, що тривіальний та стандартний макет надають самостійно. Поєднання двох типів не робить тип особливим, і ці два властивості насправді не мають великого відношення один до одного.
Стандартний макет - це чітко визначений макет його непорожніх суб'єктів (а також його порожній базовий клас, що не порушує компонування типу). Тривіальність полягає в тому, чи має об'єкт якесь значення поза блоком бітів, який він зберігає (і чи є він концептуально дійсним об'єктом, якщо він ініціалізований з довільним блоком біт).
Якщо я роблю шаблон, який приймає тип T
, і я хочу побачити, чи можу я memcpy
об'єкти такого типу, мені не байдуже розміщення його членів; Я хочу знати, чи це TriviallyCopyable. Аналогічно, правильність offsetof
не хвилює навіть, якщо клас має конструктор копій, наданий користувачем. Все, що це хвилює, полягає в тому, якщо компонування суб'єктів членів відбувається в чіткому, стандартному порядку.
В основному люди озирнулися і зрозуміли, що в C ++ нічого не залишається, що конкретно потребує перетину тривіальності та стандартного планування. Тому нам не потрібно резервувати термін для цього. Ті кілька місць, де стандарт прямо зазначає, що якийсь тип буде "POD", можна просто замінити на "тривіальне та стандартне розташування", як це доречно.
Чи є ця рекурсивна вимога зайвою?
Оскільки обидві складові вимоги є індивідуально рекурсивними, то перетин обох є рекурсивним. Тож немає явної необхідності заявляти, що всі суб’єкти також є ПОД. Це було більш ніж ймовірним лише випадком дивацтва копіювання та вставки, де в оригінальному визначенні було сказано щось на кшталт "всі члени нестатичних даних повинні бути типами POD", і вони просто зберегли це твердження як таке.