valor tutorial tag sucursales sacar que para obtener llevar español domicilio documentos debo cómo c++ constructor return-value return return-type

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.