В чем разница между "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.