В чем разница между "auto x = vector <int>()" и "vector <int>x"? - PullRequest
31 голосов
/ 16 апреля 2019

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

auto x = vector<int>();

и

vector<int> x;

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

1 Ответ

43 голосов
/ 16 апреля 2019

Они имеют такой же эффект, как 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.

...