Обычные старые типы данных с закрытыми членами? - PullRequest
5 голосов
/ 17 октября 2010

Является ли Demo типом POD в C ++ 03?

struct Demo
{
     private:
       int x;
       int y;
};

C ++ 03, §9p4:

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

После прочтения поста Стива Джессопа , я считаю, что Демо не является POD, потому что участники являются частными.Однако в стандарте ничего не говорится о связи между типами POD и модификаторами доступа.

В C ++ 0x Демонстрация - это POD, потому что в §9p9 (n3126) говорится:

APOD struct - это класс, который является и тривиальным классом, и классом стандартной компоновки , и не имеет нестатических членов-данных типа non-POD struct, non-POD union (или массива таких типов),

Демонстрация тривиальна 1 , также как и класс стандартной компоновки, так что это POD.Верна ли моя интерпретация?

1 Тривиальный класс - это класс, имеющий тривиальный конструктор по умолчанию (12.1) и легко копируемый.[9p5, n3126]

Ответы [ 2 ]

13 голосов
/ 17 октября 2010

В C ++ 03 это определенно , а не POD. Согласно §9 / 4, «A POD-struct является агрегатным классом ...», а согласно §8.5.1 / 1:

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

Под C ++ 0x, по крайней мере, начиная с N3090 / 3092, я считаю, что - это POD. Это требует только того, чтобы все нестатические члены имели одинаковый доступ, но не обязательно, чтобы этот доступ был публичным Это необходимо для устранения проблемы, на которую, я полагаю, я первым указал - в C ++ 98/03 спецификатор пустого доступа приводит к проблеме:

struct x { 
    int a;
public:
    int b;
public:
   int c;
};

Это соответствует требованиям структуры POD - но стандарт по-прежнему разрешает менять относительные позиции b и c из-за промежуточного спецификатора доступа. В результате, наличие структуры POD не обеспечивает гарантий компоновки, которые были предназначены для обеспечения совместимости со структурами C (для очевидного примера).

3 голосов
/ 07 января 2018

Начиная с C ++ 11 проще всего спросить компилятор с std :: is_pod :

#include <iostream>
#include <type_traits>

struct Demo
{
     private:
       int x;
       int y;
};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_pod<Demo>::value << std::endl;
}

правда

...