Instrucción return
Termina la función actual y devuelve el valor especificado (si hay) al llamador.
Contenido |
[editar]Sintaxis
atrib(opcional)return expresión(opcional); | (1) | ||||||||
atrib(opcional)return lista-inicialización-entre-llaves; | (2) | (desde C++11) | |||||||
atrib(opcional)co_return expresión(opcional); | (3) | (desde C++20) | |||||||
atrib(opcional)co_return lista-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
[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 localesSi expresión es una expresión-id (que puede estar entre paréntesis) que nombra a una variable cuyo tipo es
y esta variable se declarar
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:
| (desde C++11) |
Elisión de copia garantizadaSi 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
[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 |