Это структура POD в C ++ 11? - PullRequest
       43

Это структура POD в C ++ 11?

10 голосов
/ 24 августа 2011

Является ли эта структура POD в C ++ 11?

struct B
{
  int a;
  B(int aa) : a(aa) {}
  B() = default;
};

Обратите внимание, что этот вопрос явно о C ++ 11 .Я знаю, что этот класс не является POD в C ++ 98 и C ++ 03.

Объяснение POD в C ++ 11 см. В разделе тривиальное сравнение со стандартным макетом и POD

(Вдохновленный этим вопросом: Существует ли функция / макрос во время компиляции, чтобы определить, является ли структура C ++ 0x POD? )

1 Ответ

14 голосов
/ 24 августа 2011

Да, это POD в соответствии с новыми правилами .

Если вы посмотрите параграф §8.4.2 / 4 нового стандарта, вы увидите, что если конструкторустанавливается по умолчанию в первом объявлении, оно не предоставляется пользователем:

Явно-дефолтные функции и неявно объявленные функции вместе называются дефолтными функциями, и реализация должна предоставлять неявныеопределения для них (§12.1 §12.4, §12.8), что может означать определение их как удаленных.Специальная функция-член предоставляется пользователем , если она объявлена ​​пользователем и не имеет явных значений по умолчанию или удалена в первом объявлении.(...)

Вы можете использовать черту типа std::is_pod, чтобы компилятор протестировал это для вас с помощью static_assert.

static_assert(std::is_pod<B>::value, "B should be a POD");
...