связь между спецификаторами доступа и использованием списков инициализаторов для типов POD в c ++ 0x - PullRequest
2 голосов
/ 18 июля 2010

взять два следующих класса:

class Test1{
 public:
  Test1()=default;
  Test1(char in1,char in2):char1(in1),char2(in2){}
  char char1;
  char char2;
};
class Test2{
 public:
  Test2()=default;
  Test2(char in1,char in2):char1(in1),char2(in2){}
 private:
  char char1;
  char char2;
};

Я знаю, что в c ++ 0x оба этих класса рассматриваются как типы POD, и мы можем инициализировать их объекты, используя списки инициализаторов, как показано ниже:

Test1 obj1={'a','b'};//valid in c++0x
Test2 obj2={'a','b'};//valid in c++0x

Но мне интересно, что техническая причина в том, что когда у нас есть разные спецификаторы доступа в классе, как показано ниже, невозможно использовать список инициализаторов для инициализации объектов этого класса, и этот класс не рассматривается как тип POD?

class Test{
 public:
  Test()=default;
  Test(char in1,char in2):char1(in1),char2(in2){}
  char char1;
 private:
  char char2;
};
Test obj={'a','b'};//invalid in c++0x

Если вы не знаете определения POD в c ++ 0x:
Класс / структура считается POD, если он тривиален, стандартная схемаи если все его нестатические члены являются POD.

Тривиальный класс или структура определяется как тот, который:

  1. Имеет тривиальный конструктор по умолчанию.При этом может использоваться синтаксис конструктора по умолчанию (SomeConstructor () = default;).
  2. Имеет тривиальный конструктор копирования, который может использовать синтаксис по умолчанию.
  3. Имеет тривиальный оператор назначения копирования, который можетиспользуйте синтаксис по умолчанию.
  4. Имеет тривиальный деструктор, который не должен быть виртуальным.

Класс или структура стандартного макета определяются как:

  1. Имеет только нестатические элементы данных стандартного типа
  2. Имеет одинаковый контроль доступа (открытый, закрытый, защищенный) для всех нестатических элементов
  3. Не имеет виртуальныхфункции
  4. не имеет виртуальных базовых классов
  5. имеет только базовые классы типа стандартной компоновки
  6. не имеет базовых классов того же типа, что и первый определенный нестатикmember
  7. Либо не имеет базовых классов с нестатическими членами, либо не имеет нестатических элементов данных в наиболее производном классе и не более одного базового класса с нестатическими членами.По сути, в иерархии этого класса может быть только один класс, который имеет нестатические члены.

Если вы не знаете, что такое тривиальный конструктор или оператор:
Компилятор генерирует тривиальный элемент для каждого из следующих элементов класса, еслине объявлен пользователем: конструктор копирования, деструктор и оператор назначения копирования.
А также, если для класса нет объявленного пользователем конструктора, для этого класса генерируется простой конструктор по умолчанию, если есть какие-либо объявленные пользователемконструкторы, вы можете использовать синтаксис (SomeConstructor () = default;), чтобы создать свой собственный простой конструктор по умолчанию.

Ответы [ 2 ]

3 голосов
/ 18 июля 2010

«Техническая» причина заключается в следующем:

Нестатические члены данных (не объединяющего) класса с таким же контролем доступа распределяются так, чтобы более поздние члены имели более высокие адреса вОбъект класса.Порядок распределения нестатических элементов данных с различным контролем доступа не определен (C ++ 0x §9.2 / 12).

До тех пор, пока все нестатические члены данных имеют одинаковый контроль доступа, их порядок четко определен;в противном случае их порядок не указан.

0 голосов
/ 31 июля 2010
class Test{
 public:
  Test()=default;
  Test(char in1,char in2):char1(in1),char2(in2){}
  char char1;
 private:
  char char2;
};

с учетом вышеуказанного класса следующий синтаксис действителен в c ++ 0x:

Test obj={'a','b'};//valid in c++0x

Окончательное предложение здесь .

...