9 Statements [stmt.stmt]

9.6 Jump statements [stmt.jump]

9.6.3 The return statement [stmt.return]

Функция возвращается к вызывающему с помощью return оператора.

Оператор expr-or-braced-init-list возврата называется его операндом. Оператор возврата без операнда должен использоваться только в функции, тип возврата которой - cv voida constructorили a destructor. Оператор возврата с операндом типа должен использоваться только в функции, тип возврата которой равен . Оператор возврата с любым другим операндом должен использоваться только в функции, тип возврата которой не является ; оператор return инициализирует результат glvalue или объект результата prvalue вызова функции (явного или неявного) из операнда. [ Оператор возврата может включать вызов конструктора для выполнения копирования или перемещения операнда, если он не является значением prvalue или если его тип отличается от типа возврата функции. Операция копирования, связанная с оператором return, может быть исключена или преобразована в операцию перемещения, если возвращается автоматическая переменная продолжительности хранения ( ). ] [ void cv void cv void copy-initialization Note: [class.copy]end noteExample:

std::pair<std::string,int> f(const char* p, int x) {
  return {p,x};
}

end example] Выход за конец конструктора, деструктора или функции с cv void возвращаемым типом эквивалентен a return без операнда. В противном случае переход за пределы функции, отличной от main результата, приведет к неопределенному поведению.

Копирование-инициализация результата вызова упорядочивается до уничтожения временных файлов в конце полного выражения, установленного операндом оператора return, который, в свою очередь, упорядочивается до уничтожения локальных переменных ([stmt.jump]) блок, содержащий оператор возврата.