Может ли класс со всеми закрытыми членами быть классом POD?
Я слышал ранее, что типы POD не могут иметь приватных данных - но согласно черновому варианту C++0x, у меня есть более слабое требование (выделение мое):
имеет одинаковый контроль доступа (пункт 11) для всех нестатических элементов данных
который, кажется, предполагает, что частные данные в порядке, если они все частные. У меня нет копии C++03, хотя, чтобы проверить...
Тогда бы WindowsApi::Uuid
быть классом POD?
namespace WindowsApi
{
class Uuid
{
union
{
::UUID asUuid; //Win32's UUID struct
unsigned __int64 asInt64s[2];
unsigned __int32 asInt32s[4];
};
public:
Uuid() {}
Uuid(::UUID sourceStructure) : asUuid(sourceStructure) {}
operator ::UUID() { return asUuid; }
};
}
3 ответа
C++03 по-прежнему не допускает нестатические частные или защищенные данные в классах POD. Это требование указано в определении совокупности
Агрегат - это массив или класс (раздел 9) без объявленных пользователем конструкторов (12.1), без закрытых или защищенных нестатических элементов данных (раздел 11), без базовых классов (раздел 10) и без виртуальных функций (10.3).
и POD класс должен быть агрегатным первым.
Я слышал раньше, что типы POD не могут иметь личные данные
В C++03 POD-типы не могут иметь личных данных (см. Ответ AndreyT).
Однако определение POD было изменено в C++0x (см. 9/10
).
Согласно n3225
Структура POD - это класс, который является как тривиальным классом, так и классом стандартной компоновки, и не имеет нестатических членов-данных типа не-POD-структуры, не-POD-объединения (или массива таких типов).
......Класс POD - это класс, который является либо структурой POD, либо объединением POD.
Это означает
struct demo
{
private:
int a, b;
};
такое POD в C++ 0x, потому что demo
это как тривиальная, так и стандартная компоновка.
Определение Стандартного макета находится в разделе 9/7
Класс стандартного макета - это класс, который:
- не имеет нестатических членов-данных типа нестандартного класса макета (или массива таких типов) или ссылки,
- не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1),
- имеет одинаковый контроль доступа (пункт 11) для всех нестатических элементов данных,
- не имеет базовых классов нестандартной компоновки,
- либо не имеет нестатических членов данных в наиболее производном классе и не более одного базового класса с нестатическими членами данных, или не имеет базовых классов с нестатическими членами данных, и
- не имеет базовых классов того же типа, что и первый нестатический член данных.
,
Тогда WindowsApi::Uuid будет классом POD?
Nopes! WindowsApi::Uuid
не является ни POD в C++ 03, ни в C++0x. Тривиальный класс - это класс, имеющий тривиальный конструктор по умолчанию (12.1) и легко копируемый. WindowsApi::Uuid
имеет нетривиальный конструктор по умолчанию.
Таким образом, это правило было смягчено в C++ 0x тогда?
Да! (Учитывая пункт 11)
Также ознакомьтесь с разделом часто задаваемых вопросов о агрегатах и POD.
Согласно моей версии n3225 C++0x, WindowsApi::Uuid
это класс POD.
Со страницы 219. Структура POD - это класс, который является одновременно тривиальным классом и классом стандартной компоновки и не имеет нестатических членов-данных типа не-POD-структуры, не-POD-объединения (или массива таких типов).
Тривиальный класс - это класс, имеющий тривиальный конструктор по умолчанию и легко копируемый:
Тривиально копируемый класс - это класс, который:
- не имеет нетривиальных конструкторов копирования (12.8),
- не имеет нетривиальных конструкторов перемещения (12.8),
- не имеет нетривиальных операторов присваивания копий (13.5.3, 12.8),
- не имеет нетривиальных операторов присваивания перемещений (13.5.3, 12.8), и
- имеет тривиальный деструктор (12.4).
Класс стандартного макета - это класс, который:
- не имеет нестатических членов-данных типа нестандартного класса макета (или массива таких типов) или ссылки,
- не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1),
- имеет одинаковый контроль доступа (пункт 11) для всех нестатических элементов данных,
- не имеет базовых классов нестандартной компоновки,
- либо не имеет нестатических членов данных в наиболее производном классе и не более одного базового класса с нестатическими членами данных, или не имеет базовых классов с нестатическими членами данных, и
- не имеет базовых классов того же типа, что и первый нестатический член данных.
поскольку WindowsApi
не нарушает ни одно из этих ограничений, это будет действительный класс POD в C++0x. Как отмечает AndreyT, это более щедрая формулировка, чем C++03.