Подтвердить что ты не робот

Почему это не POD?

Речь идет о std::is_pod, который определяет, является ли шаблон простым старым типом данных или нет.

Смотрите следующий код:

struct A {
public:
    int m1;
    int m2;
};

struct B {
public:
    int m1;
private:
    int m2;
};

struct C {
private:
    int m1;
    int m2;
};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_pod<A>::value << '\n'; // true
    std::cout << std::is_pod<B>::value << '\n'; // false
    std::cout << std::is_pod<C>::value << '\n'; // true
}

Все три структуры выглядят как POD для меня. Но, очевидно, struct B нет. Я не понимаю, почему. Для меня все они имеют тривиальный конструктор, оператор перемещения и копирования. Деструктор тоже является тривиальным.

Я обвиняю его в использовании 2 спецификаторов доступа, но я не могу найти информацию об этом.

4b9b3361

Ответ 1

В соответствии со стандартом ( 9 Классы [класс], основное внимание):

Класс стандартного макета - это класс, который:

...

- имеет тот же контроль доступа (раздел 11) для всех нестатических членов данных,

...

и

Структура POD - это неединичный класс, который является тривиальным классом и стандартным классом макета и...

Ваша догадка правильная, потому что B.m1 и B.m2 являются нестатическими и имеют различное управление доступом.