DIRECT- VS COPY-INITIALIZATION
Через этот вопрос (Это прямая инициализация или инициализация копированием?) Я узнал разницу между прямой инициализацией и инициализацией копированием:
direct-initialization copy-initialization ----------------------- --------------------- obj s("value"); obj s = obj("value"); obj s = "value"; obj s{"value"}; obj s = {"value"}; obj s = obj{"value"};
Я упоминаю об этом здесь для полноты картины. Мои фактические вопросы для этой страницы перечислены в следующем абзаце >>
ПРЯМАЯ ИНИЦИАЛИЗАЦИЯ И ПРЯМАЯ ИНИЦИАЛИЗАЦИЯ СПИСКА
Ответы показали, что в категории прямой инициализации можно провести различие между прямой инициализацией и прямая-инициализация-списка.:
obj s("value"); // direct-initialization obj s{"value"}; // direct-list-initialization
Я знаю, что инициализация списка не допускает сужения, так что инициализация типа int x{3.5};
не будет компилироваться. Но кроме этого, у меня есть пара вопросов:
(1) Есть ли разница в выводе компилятора междуobj s("value");
и obj s{"value"};
?
Давайте рассмотрим компилятор без каких-либо оптимизаций. Я хотел бы знать любые возможные технические различия :-)
(2) Возможно, мне следует задать тот же самый вопрос для инициализации с несколькими переменными, например:obj s("val1", "val2");
и obj s{"val1", "val2"};
(3) Я заметил, что при инициализации списка иногда может вызываться другой конструктор, например:
vector<int> a{10,20}; //Curly braces -> fills the vector with the arguments
vector<int> b(10,20); //Parentesis -> uses arguments to parameterize some functionality
Как это возможно?
РАССМОТРИЛИ ЗДЕСЬ ВСЕ ВОЗМОЖНЫЕ ИНИЦИАЛИЗАЦИИ?
Исходя из моих ограниченных знаний о C++, я полагаю, что все возможные инициализации объектов (как с собственным типом, так и с типом, определяемым пользователем) были рассмотрены в примеры выше. Это правильно? Я что-то проглядел?
PS: я изучаю C++ (я знаю C, но еще не C++), поэтому, пожалуйста, не ругайте меня ;-)
g++
предупредит, но продолжит. В любом случае, ИМО, этот вопрос слишком широк, и на многие его отдельные элементы уже есть ответы в другом месте. И если вы хотите знать, будет ли компилятор создавать другой код... просто попробуйте? - person underscore_d   schedule 21.11.2017