Espacios de nombres
Variantes
Acciones

Instrucción return

De cppreference.com
< cpp‎ | language

Termina la función actual y devuelve el valor especificado (si hay) al llamador.

Contenido

[editar]Sintaxis

atrib(opcional)returnexpresión(opcional); (1)
atrib(opcional)returnlista-inicialización-entre-llaves; (2) (desde C++11)
atrib(opcional)co_returnexpresión(opcional); (3) (desde C++20)
atrib(opcional)co_returnlista-inicialización-entre-llaves; (4) (desde C++20)
atrib - (desde C++11) secuencia opcional de cualquier número de atributos
expresión - expresión, convertible al tipo de retorno de la función
lista-inicialización-entre-llaves - lista de inicializadores entre llaves y otras listas de inicio entre llaves

[editar]Explicación

1) Evalúa la expresión, termina la función actual y devuelve el resultado de la expresión al llamador, después de la conversión implícita al tipo de retorno de la función. La expresión es opcional en funciones cuyo tipo de retorno es void (que puede estar calificado cv), y no se permite en constructores y destructores.
2) Usa inicialización de lista de copia para crear el valor de retorno de la función.
3,4) En una corrutina, se debe usar la palabra clave co_return en vez de return para el punto de suspensión final (véase corrutinas para más detalles).

[editar]Notas

Si el control alcanza el final de

  • una función con tipo de retorno void (que puede estar calificado cv),
  • un constructor,
  • un destructor, o
  • un bloque try de función para una función con tipo de retorno void (que puede estar calificado cv)

sin encontrar una instrucción return, se ejecuta return;.

Si el control llega al final de la función main, se ejecuta return0;.

Salir del final de una función con retorno de valor (except main) sin una instrucción tiene un comportamiento indefinido.

En una función que retorna void (que puede estar calificado cv), se puede usar la instrucción return con expresión, si el tipo de la expresión es void (que puede estar calificado cv).

Si el tipo de retorno de una función se especifica como un tipo automático, se deducirá del tipo de return.

La incialización de copia del resultado de la llamada a la función se secuencia antes de la destrucción de todos los temporales al final de expresión, que, a su vez, se secuencia antes de la destrucción de las variables locales del bloque que encierra la instrucción return.

(desde C++14)

La devolución por valor puede implicar la construcción y la copia/movimiento de un objeto temporal. A no ser que se use copia elision. Concretamente, las condiciones para copiar/mover son las siguientes:

Movimiento automático desde variables y parámetros locales

Si expresión es una expresión-id (que puede estar entre paréntesis) que nombra a una variable cuyo tipo es

  • un tipo objeto no volátil o
  • una referencia rvalue no volátil a un tipo objeto
(desde C++20)

y esta variable se declarar

  • en el cuerpo o
  • como un parámetro de
la función envolvente más interna o expresión lambda,

entonces la resolución de sobrecarga para seleccionar el constructor a usar en la inicialización del valor de retorno o, para co_return, seleccionar la sobrecarga de promise.return_value()(desde C++20) se realiza dos veces:

  • si la primera resolución de sobrecarga falla o
  • tuvo éxito, pero no selecciono el constructor de movimiento (formalmente, el primer parámetro del constructor seleccionado no era una referencia rvalue al tipo (que puede estar calificado cv) de expresión)
(hasta C++20)
  • después se realiza la resolución de sobrecarga como de costumbre, considerando expresión como un lvalue (con lo que puede seleccionar el constructor de copia).
(desde C++11)

Elisión de copia garantizada

Si expresión es un prvalue, el objeto resultante se inicializa directamente por dicha expresión. Esto no implica un constructor de copia o movimiento cuando los tipos coinciden (véase elisión de copia).

(desde C++17)

[editar]Palabras clave

return, co_return

[editar]Ejemplo

#include <iostream>#include <string>#include <utility>   void fa(int i){if(i ==2)return;std::cout<< i <<'\n';}// return implíctito;   int fb(int i){if(i >4)return4;std::cout<< i <<'\n';return2;}   std::pair<std::string, int> fc(constchar* p, int x){return{p, x};}   void fd(){return fa(10);// fa(10) es una expresión void}   int main(){ fa(2);// retorna, no hace nada cunado i==2 fa(1);// imprime su argumento, luego retornaint i = fb(5);// devuelve 4 i = fb(i);// imprime su argumento, devuelve 2std::cout<< i <<'\n'<< fc("Hola", 7).second<<'\n'; fd();}

Salida:

1 4 2 7 10

[editar]Informe de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
CWG 1579 C++11 no se permitía mediante conversión del constructor de movimiento se habilita búsqueda de conversión de constructor de movimiento
CWG 1885 C++14 la secuencia dela destrucción de variables automáticas no era explícita se añaden reglas de secuencia

[editar]Véase también

Documentación de C para instrucción return
close