return {};
означает, что {}
это инициализатор для возвращаемого значения . Возвращаемое значение инициализируется пустым списком.
Вот некоторая предыстория возвращаемого значения , основанная на [stmt.return] в Стандарте C ++:
Для функции, которая возвращается по значению (т. Е. Тип возвращаемого значения не является ссылкой и не void
), существует временный объект, называемый возвращаемым значением . Этот объект создается return
оператором, и его инициализаторы зависят от того, что было в операторе возврата.
Возвращаемое значение сохраняется до конца полного выражения в коде, вызвавшем функцию; если он имеет тип класса, то его деструктор будет запущен, если его время жизни не будет продлено вызывающим, привязавшим ссылку непосредственно к нему.
Возвращаемое значение можно инициализировать двумя разными способами:
Предполагая T
, что это тип возвращаемого значения функции, обратите внимание, что return T{};
это отличается от return {}
: в первом случае создается временное значение T{}
, а затем возвращаемое значение инициализируется копией из этого временного.
Это не будет скомпилировано, если T
нет доступного конструктора копирования / перемещения, но return {};
будет успешным, даже если эти конструкторы отсутствуют. Соответственно, return T{};
могут отображаться побочные эффекты конструктора копирования и т. Д., Хотя это контекст исключения копирования, поэтому может и не быть.
Вот краткое описание инициализации списков в C ++ 14 (N4140 [dcl.init.list] / 3), где инициализатором является пустой список:
- Если
T
является агрегатом, то каждый член инициализируется из его инициализатора фигурной скобки или равного-равного, если он есть, в противном случае, как если бы by {}
(поэтому применяйте эти шаги рекурсивно).
- Если
T
это тип класса с предоставленным пользователем конструктором по умолчанию, этот конструктор вызывается.
- Если
T
это тип класса с неявно определенным или = default
созданным конструктором по умолчанию, объект инициализируется нулем, а затем вызывается конструктор по умолчанию.
- Если
T
- std::initializer_list
, возвращаемое значение - пустой такой список.
- В противном случае (т.е.
T
это неклассовый тип - возвращаемые типы не могут быть массивами) возвращаемое значение инициализируется нулем.