универсальная инициализация и std::initializer_list

Я изучаю С++ и дошел до того, что читаю об инициализации списка. После небольшого замешательства из-за перекрытия синтаксиса я понял, что универсальная инициализация и инициализация списка действительно являются двумя разными (хотя, как я только что сказал, перекрывающимися) новыми функциями С++ 11. Итак, прежде чем я задам свой вопрос, я хотел бы резюмировать, и, пожалуйста, поправьте меня, если я что-то неправильно понимаю (до того, как что-то станет неправильным представлением об этой теме..)

что касается встроенных типов, то синтаксис их инициализации следующий (я предполагаю, что это int для удобочитаемости):

// defines a default initialized int
int a;
// defines a value initialized int (binary zeroes)
int a{};

// equivalent definitions,define an int variable of value 10:
int a=10;
int a(10);
int a{10};
int a={10};

// equivalent definitions,define a temporary int variable of value 10:
int(10);
int{10};

// equivalent definitions,define a temporary int variable that is value initialized to 0:
int();
int{};

теперь к интересной части, используя юниформ-инициализацию для агрегатных типов (массивы и агрегатные структуры). До C++11 я мог инициализировать массивы и агрегировать классы с помощью инициализатора списка:

int array[]={1,2,3};

struct aggregate {
  int a;
  double b;
};

aggregate a={1,2.3};

теперь я знаю, что новый стандарт позволяет мне использовать новый синтаксис для юниформ-инициализации:

int array[]{1,2,3};
aggregate a{1,2,3};

это может пригодиться для использования в списках инициализации членов конструктора.

а теперь к типам классов. Если класс не определяет конструктор initializers_list:

// equivalent definitions,define a class_type variable,default initialized:
class_type name;
class_type name{};

// equivalent definitions,define a class_type variable,using the appropriate constructor:
class_type name(*args*);
class_type name{*args*};
class_type name={*args*};

// defines a class_type variable and calls copy-constructor (allows implicit conversion to class_type if converting constructor is non-explicit)
class_type name=name2;      

// equivalent definitions,define a temporary class_type object,default initialized
class_type();
class_type{};

// equivalent definitions,define a temporary class_type object,initialized by the appropriate constructor
class_type(*args*);
class_type{*args*};

Я знаю, что когда класс определяет конструктор class_type::class_type(const std::initializer_list&), он имеет приоритет над другими конструкторами (если только это не пустой список, а затем конструктор по умолчанию имеет приоритет).

Теперь мой вопрос:

что = меняет, когда я использую его со списком в фигурных скобках? Единственная разница, о которой я мог подумать, заключается в том, является ли конструктор списка инициализации явным или нет.

class_type name{*args*};
class_type name={*args*};

такой же как

class_type name({*args*});
class_type name=class_type(std::initializer_list({*args*}));

так вот неявное преобразование инициализации копии задействовано? это единственная разница?

пожалуйста, поправьте меня, если я говорю что-то вопиюще неправильное!


person Luca    schedule 16.09.2015    source источник
comment
class_type name; инициализировано по умолчанию против class_type name{}; инициализировано значением. это не то же самое.   -  person Jarod42    schedule 16.09.2015
comment
Инициализированное значением int всегда имеет значение 0, даже если вы используете сумасшедшую архитектуру, где значение 0 не равно нулю. И class_type(), и class_type{} являются инициализацией значения, предполагая, что класс не является агрегатом.   -  person T.C.    schedule 16.09.2015
comment
@ Jarod42 Jarod42 да, разве это не то же самое для типов классов? всегда вызывается конструктор по умолчанию   -  person Luca    schedule 16.09.2015
comment
Они отличаются, если конструктор по умолчанию не предоставляется пользователем.   -  person T.C.    schedule 16.09.2015