Может ли класс со всеми закрытыми членами быть классом 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.

Другие вопросы по тегам