Почему это не 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 спецификаторов доступа, но я не могу найти информацию об этом.
Ответы
Ответ 1
В соответствии со стандартом ( 9 Классы [класс], основное внимание):
Класс стандартного макета - это класс, который:
...
- имеет тот же контроль доступа (раздел 11) для всех нестатических членов данных,
...
и
Структура POD - это неединичный класс, который является тривиальным классом и стандартным классом макета и...
Ваша догадка правильная, потому что B.m1
и B.m2
являются нестатическими и имеют различное управление доступом.