Ответ 1
Они имеют такой же эффект, как С++ 17. Оба создают объект с именем x
с типом std::vector<int>
, который инициализируется конструктором по умолчанию std::vector
.
Точно 1-й - это инициализация копии, x
инициализируется копией из временного значения, инициализированного значением. Начиная с С++ 17 гарантируется такой тип исключения копирования, поскольку результат x
инициализируется конструктором по умолчанию из std::vector
напрямую. До С++ 17 копирование elision является оптимизацией:
даже если это происходит, и конструктор копирования/перемещения (начиная с С++ 11) не вызывается, он все равно должен присутствовать и быть доступным (как если бы оптимизация вообще не происходила), в противном случае программа некорректна:
Второй - инициализация по умолчанию, так как тип класса x
инициализируется конструктором по умолчанию из std::vector
.
Обратите внимание, что поведение может отличаться для других типов в зависимости от поведения типа и продолжительности хранения x
.