Может ли класс со всеми закрытыми членами быть классом POD? - PullRequest
6 голосов
/ 21 января 2011

Я слышал раньше, что у типов 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 ]

10 голосов
/ 21 января 2011

Я слышал раньше, что типы POD не могут иметь личные данные

В C ++ 03 типы POD не могут иметь личные данные (см. Ответ AndreyT).

Однако определение POD было изменено в C ++ 0x (см. 9/10).

Согласно n3225

Структура POD - это классэто и простой класс , и класс стандартной компоновки , и в нем нет нестатических членов-данных типа non-POD struct, объединения без POD (или массива таких типов).
... ...

Класс POD - это класс, который является либо структурой POD, либо объединением POD.

Это означает, что

struct demo
{
   private:
      int a, b;
};

- это PODв C ++ 0x, потому что demo является одновременно тривиальным и стандартным макетом .

Определение стандартного макета находится в разделе 9/7

Стандарт-layout class - это класс, который:

  • не имеет нестатических членов-данных типа класса нестандартной компоновки (или массива таких типов) или ссылки,
  • не имеетвиртуальные функции (10.3) и нет виртуальных базовых классов (10.1),
  • имеет одинаковый контроль доступа (пункт 11) для всех нестатических элементов данных ,
  • не имеетбазовые классы стандартной компоновки
  • либо не имеют нестатических членов данных в наиболее производном классе и не более одного базового класса с нестатическими членами данных, либо не имеют базовых классов с нестатическими элементами данныхи
  • не имеет базовых классов того же типа, что и первый нестатический элемент данных.11

.

Тогда бы, WindowsApi :: Uuid будет классом POD?

Нет!WindowsApi::Uuid не является ни POD в C ++ 03, ни в C ++ 0x.Тривиальный класс - это класс, который имеет простой конструктор по умолчанию (12.1) и легко копируется.WindowsApi::Uuid имеет нетривиальный конструктор по умолчанию.

То есть это правило было ослаблено в C ++ 0x, тогда?

Да!(Принимая во внимание пункт 11)

Также проверьте запись FAQ по агрегатам и POD

10 голосов
/ 21 января 2011

C ++ 03 по-прежнему не допускает нестатические частные или защищенные данные в классах POD. Это требование указано в определении совокупности 1002 *

Агрегат - это массив или класс (раздел 9) без объявленных пользователем конструкторов (12.1), без закрытых или защищенных нестатических элементов данных (раздел 11) , без базовых классов (раздел 10) и без виртуальных функций (10.3).

и POD класс должен быть сначала агрегатом.

0 голосов
/ 21 января 2011

Согласно моему черновому варианту 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.

...