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

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

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

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

Для объяснения POD в С++ 11 см. тривиальный и стандартный макет против POD

(Вдохновленный этим вопросом: Есть ли компиляция func/macro, чтобы определить, является ли С++ 0x struct POD?)

Ответ 1

Да, это 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");