Чи є тип POD точно таким же, як тривіальний, стандартний тип макета?


22

У C ++ 20 поняття POD є застарілим, нібито тому, що це безглузда складна риса тривіальності та стандартного макета. Однак визначення POD у проекті С ++ 20 не є точно "і тривіальним, і стандартним макетом"; це насправді:

Клас POD - це клас, який є і тривіальним класом, і класом стандартного макета, і не має нестатичних членів даних типу не-POD класу (або його масиву). Тип POD - це скалярний тип, клас POD, масив такого типу або версія, що відповідає кваліфікації одного з цих типів.

Іншими словами, тип POD не лише є тривіальним та стандартним макетом, але й рекурсивно.

Чи є ця рекурсивна вимога зайвою? Іншими словами, якщо тип є і тривіальним, і стандартним макетом, чи автоматично це рекурсивно тривіальний і стандартний макет? Якщо відповідь "ні", то що є прикладом стандартного макета, тривіального типу, який не може бути ПОД?

Відповіді:


12

У C ++ 20 поняття POD є застарілим, нібито тому, що це безглузда складна риса тривіальності та стандартного макета.

Неправильно. Термін POD застаряє, оскільки це вже не має значення :

Термін POD більше не служить цілі в стандарті, він просто визначений, і обмеження застосовуються, коли кілька інших типів зберігають цю вестигіальну властивість.

По суті, тип, який є і тривіальним, і стандартним макетом, не отримує ніяких здібностей, крім того, що тривіальний та стандартний макет надають самостійно. Поєднання двох типів не робить тип особливим, і ці два властивості насправді не мають великого відношення один до одного.

Стандартний макет - це чітко визначений макет його непорожніх суб'єктів (а також його порожній базовий клас, що не порушує компонування типу). Тривіальність полягає в тому, чи має об'єкт якесь значення поза блоком бітів, який він зберігає (і чи є він концептуально дійсним об'єктом, якщо він ініціалізований з довільним блоком біт).

Якщо я роблю шаблон, який приймає тип T, і я хочу побачити, чи можу я memcpyоб'єкти такого типу, мені не байдуже розміщення його членів; Я хочу знати, чи це TriviallyCopyable. Аналогічно, правильність offsetofне хвилює навіть, якщо клас має конструктор копій, наданий користувачем. Все, що це хвилює, полягає в тому, якщо компонування суб'єктів членів відбувається в чіткому, стандартному порядку.

В основному люди озирнулися і зрозуміли, що в C ++ нічого не залишається, що конкретно потребує перетину тривіальності та стандартного планування. Тому нам не потрібно резервувати термін для цього. Ті кілька місць, де стандарт прямо зазначає, що якийсь тип буде "POD", можна просто замінити на "тривіальне та стандартне розташування", як це доречно.

Чи є ця рекурсивна вимога зайвою?

Оскільки обидві складові вимоги є індивідуально рекурсивними, то перетин обох є рекурсивним. Тож немає явної необхідності заявляти, що всі суб’єкти також є ПОД. Це було більш ніж ймовірним лише випадком дивацтва копіювання та вставки, де в оригінальному визначенні було сказано щось на кшталт "всі члени нестатичних даних повинні бути типами POD", і вони просто зберегли це твердження як таке.


" Все, що його хвилює, - це якщо розташування суб'єктів членів відбувається в чіткому, стандартному порядку ". Чому std повинен виконувати наказ, щоб можна було визначити зсув члена? Це мета std, щоб дозволити шаленим імпульсам, коли члени не мають компенсувати?
curiousguy

1

Стандартна компонування залежить від стандартної компонування нестатичних елементів:

[class.prop]

Клас S - це клас стандартного планування, якщо він:

  • не має нестатичних членів даних типу нестандартного класу класу (або масиву таких типів) або посилань,

  • ...

Тривіальність залежить також від тривіальності нестатичних членів. Для стиснення я наводив лише правило для конструктора за замовчуванням, але інші функції спеціальних членів мають подібне формулювання:

[class.default.ctor]

Конструктор за замовчуванням є тривіальним, якщо він не надається користувачем і якщо:

  • ...
  • для всіх нестатичних членів свого класу, що належать до класу типу (або масиву), кожен такий клас має тривіальний деструктор.

Наскільки я можу сказати, явна вимога PODness звертатися до членів є зайвою, оскільки це також неявно випливає з вимог бути стандартними та тривіальними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.