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