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это неклассовый тип - возвращаемые типы не могут быть массивами) возвращаемое значение инициализируется нулем.