Чем полезен is_standard_layout?

Из того, что я понимаю, стандартное расположение позволяет три вещи:

  • Оптимизация пустого базового класса
  • Обратная совместимость с C с определенным приведением указателей
  • Использование offsetof

Теперь в библиотеке есть is_standard_layout метафункция предиката, но я не вижу большой пользы для него в универсальном коде, поскольку перечисленные выше функции C, по-видимому, крайне редко нуждаются в проверке в универсальном коде. Единственное, о чем я могу думать, это использовать его внутри static_assert, но это только для того, чтобы сделать код более надежным и не обязательным.

Как is_standard_layout полезно? Существуют ли вещи, которые были бы невозможны без него, и поэтому требовались бы в стандартной библиотеке?

12

Решение

Общий ответ

Это способ проверки предположений. Вы не хотели бы писать код, который предполагает стандартную компоновку, если бы это было не так.

C ++ 11 предоставляет несколько таких утилит. Они особенно полезны для написания универсального кода (шаблонов), где в противном случае вам пришлось бы доверять клиентскому коду, чтобы не допустить ошибок.


Примечания, специфичные для is_standard_layout

Для меня это выглядит как (псевдокод) определение is_pod будет примерно …

// note: applied recursively to all members
bool is_pod(T) { return is_standard_layout(T) && is_trivial(T); }

Итак, вам нужно знать is_standard_layout для того, чтобы реализовать is_pod, Учитывая это, мы могли бы также разоблачить is_standard_layout как инструмент, доступный для разработчиков библиотеки. Также обратите внимание: если у вас есть сценарий использования для is_podВы можете рассмотреть возможность того, что is_standard_layout на самом деле может быть лучшим (более точным) выбором в этом случае, поскольку POD, по сути, является подмножеством стандартной компоновки.

У меня такое ощущение, что они добавили каждый возможный вариант оценки типа, независимо от какой-либо очевидной ценности, на тот случай, если кто-то может столкнуться с необходимостью за некоторое время до выхода следующего стандарта. Я сомневаюсь, что нагромождение этих «лишних» свойств типов добавляет значительную дополнительную нагрузку разработчикам компиляторов.

Здесь приятно обсудить стандартное расположение: Почему C ++ 11 POD "стандартное расположение" определение так оно и есть?
На cppreference.com также есть много хороших деталей: Нестатические члены данных

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]