В чем разница между "auto x = vector <int>()" и "vector <int> x"?

В чем разница между:

auto x = vector<int>();

а также

vector<int> x;

Оба эти объявления эквивалентны, или есть какая-то разница со сложностью во время выполнения?

Ответ 1

Они имеют такой же эффект, как С++ 17. Оба создают объект с именем x с типом std::vector<int>, который инициализируется конструктором по умолчанию std::vector.

Точно 1-й - это инициализация копии, x инициализируется копией из временного значения, инициализированного значением. Начиная с С++ 17 гарантируется такой тип исключения копирования, поскольку результат x инициализируется конструктором по умолчанию из std::vector напрямую. До С++ 17 копирование elision является оптимизацией:

даже если это происходит, и конструктор копирования/перемещения (начиная с С++ 11) не вызывается, он все равно должен присутствовать и быть доступным (как если бы оптимизация вообще не происходила), в противном случае программа некорректна:

Второй - инициализация по умолчанию, так как тип класса x инициализируется конструктором по умолчанию из std::vector.

Обратите внимание, что поведение может отличаться для других типов в зависимости от поведения типа и продолжительности хранения x.