c++ - tutorial - ¿Qué ocurre si escribo declaración de devolución en el constructor?
sucursales tag (2)
¿Qué ocurre si escribo declaración de devolución en el constructor? ¿Es estándar?
struct A
{
A() { return; }
};
El código anterior compila bien, sin ningún error en ideone . Pero el siguiente código no:
struct A
{
A() { return 100; }
};
Da este error en ideone :
error: devolver un valor de un constructor
Entiendo que devolver valor desde el constructor no tiene ningún sentido, porque no menciona explícitamente el tipo de devolución, y no podemos almacenar el valor devuelto después de todo. Pero tengo curiosidad por saber:
- ¿Qué enunciado del Estándar C ++ permite el primer ejemplo pero prohíbe el segundo? ¿Hay alguna declaración explícita ?
- ¿El tipo de devolución en el primer ejemplo está
void
? - ¿Hay algún tipo de devolución implícita ?
Quizás la noción de tener un retorno sin tipo en los constructores es controlar la terminación de la función constructora.
struct A
{
// more definitions
A()
{
if( !goodToGoOn)
return;
// the rest of the stuffs go here
}
};
Sí, usar declaraciones de devolución en constructores es perfectamente estándar.
Los constructores son funciones que no devuelven un valor . La familia de funciones que no devuelve un valor consta de: funciones vacías, constructores y destructores. Se establece en 6.6.3 / 2 en el estándar de C ++. El mismo 6.6.3 / 2 establece que es ilegal usar return
con un argumento en una función que no devuelve un valor.
6.6.3 La declaración de devolución
2 Una declaración de retorno sin una expresión se puede usar solo en funciones que no devuelven un valor, es decir, una función con el tipo de retorno void, un constructor (12.1) o un destructor (12.4). Una declaración de retorno con una expresión de tipo no nulo se puede usar solo en funciones que devuelven un valor; el valor de la expresión se devuelve a la persona que llama de la función.
Además, 12.1 / 12 establece que
12.1 Constructores
12 No se especificará ningún tipo de devolución (ni siquiera nulo) para un constructor. Una declaración de devolución en el cuerpo de un constructor no debe especificar un valor de retorno.
Nótese, por cierto, que en C ++ es legal usar return
con un argumento en una función void, siempre que el argumento de return
tenga un tipo void
void foo() {
return (void) 0; // Legal in C++ (but not in C)
}
Esto no está permitido en los constructores, ya que los constructores no son funciones nulas.
También hay una restricción relativamente oscura relevante para el uso de return
con los constructores: es ilegal usar return
en function-try-block de un constructor (con otras funciones está bien)
15.3 Manejando una excepción
15 Si aparece una instrucción return en un controlador de la función-try-block de un constructor, el programa está mal formado.