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некласовий тип - типи повернення не можуть бути масивами), значення повернення ініціалізується нулем.