C++: конструктор и список инициализаторов в структуре/классе

Объект структуры/класса (у которого нет конструктора) можно создать с помощью списка инициализаторов. Почему это не разрешено для структуры/класса с конструктором?

struct r { int a; };
struct s { int a; s() : a(0) {} };
r = { 1 }; // works
s = { 1 }; // does not work

person Anycorn    schedule 19.01.2010    source источник
comment
Опубликуйте код, иллюстрирующий то, о чем вы спрашиваете.   -  person    schedule 19.01.2010
comment
Нил, ответ имел смысл для меня.   -  person Anycorn    schedule 19.01.2010


Ответы (2)


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

Обратите внимание, что предстоящий стандарт C++ позволит вам определять списки инициализаторов, что позволит инициализировать объекты, не относящиеся к POD, с помощью фигурных скобок.

person Collin Dauphinee    schedule 19.01.2010

Если под своим вопросом вы хотите спросить: «Могу ли я сделать это?»

struct MyGizmo
{
  char things_[5];
  MyGizmo() : things_({'a', 'b', 'c', 'd', 'e'}) ();
};

...тогда ответ - нет. С++ не позволяет этого.

person John Dibling    schedule 19.01.2010
comment
Нет, инициализация массива символов отличается от инициализации структуры POD, которая может содержать переменные разных типов. Кроме того, вы делаете это ctor, OP запросил инициализацию объекта с определенным ctor. - person Macke; 19.01.2010
comment
на самом деле, g++ умеет это делать, не стандартно: (char[1]){ 0 } - person Anycorn; 19.01.2010