return {};
означає, що {}
це ініціалізатор для повернутого значення . Повернене значення ініціюється list з порожнім списком.
Ось деякий фон щодо значення , що повертається , на основі [stmt.return] у стандарті C ++:
Для функції, яка повертається за значенням (тобто тип повернення не є посиланням і не void
), існує тимчасовий об'єкт, який називається значенням повернення . Цей об'єкт створюється return
оператором, і його ініціалізатори залежать від того, що було в операторі return.
Повернене значення зберігається до кінця повно вираження в коді, який викликав функцію; якщо він має тип класу, то його деструктор запуститься, якщо його життя не буде продовжено, якщо абонент пов'язує посилання безпосередньо на нього.
Повернене значення може бути ініціалізовано двома різними способами:
return some_expression;
- значення повернення ініціалізується зsome_expression
return { possibly_empty_list };
- повернене значення
ініціалізується зі списку.
Якщо припустити T
, що це тип повернення функції, то зауважте, що return T{};
відрізняється від return {}
: у першому створюється тимчасове T{}
, а потім повернене значення копіюється ініціалізується з цього тимчасового.
Це не вдасться скомпілювати, якщо T
не має доступної копії / переміщення-конструктора, але return {};
буде успішною, навіть якщо цих конструкторів немає. Відповідно, return T{};
можуть проявлятися побічні ефекти конструктора копіювання тощо, хоча це контекст елісії копіювання, тому він не може.
Ось короткий підсумок ініціалізації списку в C ++ 14 (N4140 [dcl.init.list] / 3), де ініціалізатор - порожній список:
- Якщо
T
це сукупність, то кожен член ініціалізується зі свого ідентифікатора дужок або рівних, якщо він був, інакше, як якщо б {}
(тому застосовуйте ці кроки рекурсивно).
- Якщо
T
це клас класу з наданим користувачем конструктором за замовчуванням, цей конструктор викликається.
- Якщо
T
це клас класу з неявно визначеним = default
конструктором або редактором за замовчуванням, об'єкт ініціалізується нулем і тоді викликається конструктор за замовчуванням.
- Якщо
T
це a std::initializer_list
, повернене значення - порожній такий список.
- В іншому випадку (тобто
T
некласовий тип - типи повернення не можуть бути масивами), значення повернення ініціалізується нулем.