Согласно определению структуры (2003) стандарта, это специализированный случай класса с различными модификаторами доступа по умолчанию для членов, функций и базовых классов.Далее также определяются требования к структуре как к POD-структуре.
Стандарт C ++ 2003, ISO 14882, раздел 9.0.4:
Структура - это определенный класссо структурой ключ-класс;его члены и базовые классы (раздел 10) являются общедоступными по умолчанию (раздел 11).Объединение - это класс, определенный с помощью объединения ключ-класс;по умолчанию его члены общедоступны, и он одновременно содержит только один элемент данных (9.5).[Примечание: агрегаты типа класса описаны в 8.5.1.] POD-структура - это агрегатный класс, который не имеет нестатических членов-данных типа non-POD-struct, non-POD-union (или массива таких типов) или ссылки, и не имеет пользовательского оператора назначения копирования ипользовательский деструктор отсутствует.Аналогично, POD-объединение - это совокупное объединение, которое не имеет нестатических членов-данных типа non-POD-struct, non-POD-union (или массива таких типов) или ссылки, и не имеет никакого пользовательского оператора назначения копирования и не имеетпользовательский деструктор.Класс POD - это класс, который является либо POD-структурой, либо POD-объединением.
Учитывая это определение, единственным дифференцирующим фактором между не-POD структурой и классом является модификатор доступа по умолчанию,
Вот то, что я мог бы себе представить как цель иметь структуры без POD:
- Это устаревшая функция, которую необходимо поддерживать для обратной совместимости
- Печатать
public:
сложно.
Наличие структур, не являющихся POD, может привести к боли, когда предполагается, что они являются POD другими системами, например, когда передаются на C и обратно.Чтобы проиллюстрировать, этот человек столкнулся с проблемами, когда структура, которая, как предполагалось, была POD, была обновлена другим разработчиком так, что она больше не была POD .Поскольку POD-ness не устанавливается статически по умолчанию компилятором, приложение будет аварийно завершать работу во время выполнения, когда эта структура использовалась в контекстах, где можно использовать только структуры POD.Хуже того, я мог бы представить (хотя я точно не знаю, возможно ли это) структуру, не относящуюся к POD, которая работает в определенных обстоятельствах, требующих POD, и не работает в других, что приводит к ошибкам и сбоям, которые являются ничем иным, как труднымвыследить.
Видя, что существуют ситуации, когда наличие не-POD структур может привести к странному и нарушенному поведению, что такое использование не-POD структур?Почему структуры не проверяются статически на POD-ness во время компиляции (через std :: is_pod в C ++ 11 или в Boost-эквиваленте)?