return {};
significa que {}
es el inicializador del valor de retorno . El valor de retorno se inicializa con una lista vacía.
Aquí hay algunos antecedentes sobre el valor de retorno , basado en [stmt.return] en el estándar C ++:
Para una función que devuelve por valor (es decir, el tipo de retorno no es una referencia ni tampoco void
), hay un objeto temporal llamado valor de retorno . Este objeto es creado por elreturn
declaración y sus inicializadores dependen de lo que estaba en la declaración de retorno.
El valor de retorno sobrevive hasta el final de la expresión completa en el código que llamó a la función; si tiene un tipo de clase, entonces su destructor se ejecutará a menos que su vida útil se extienda por el llamador vinculando una referencia directamente a él.
El valor de retorno se puede inicializar de dos formas diferentes:
return some_expression;
- el valor de retorno se copia-inicializa desdesome_expression
return { possibly_empty_list };
- el valor de retorno se
inicializa por lista de la lista.
Suponiendo que T
es el tipo de retorno de la función, tenga en cuenta que return T{};
es diferente a return {}
: en el primero, T{}
se crea un temporal , y luego el valor de retorno se inicializa con copia a partir de ese temporal.
Esto no se podrá compilar si T
no tiene un constructor de copia / movimiento accesible, pero return {};
tendrá éxito incluso si esos constructores no están presentes. En consecuencia, return T{};
puede mostrar efectos secundarios del constructor de copia, etc., aunque este es un contexto de elisión de copia, por lo que puede que no.
Aquí hay un breve resumen de la inicialización de lista en C ++ 14 (N4140 [dcl.init.list] / 3), donde el inicializador es una lista vacía:
- Si
T
es un agregado, entonces cada miembro se inicializa a partir de su inicializador de llaves o igual si tuviera uno, de lo contrario, como por {}
(así que aplique estos pasos de forma recursiva).
- Si
T
es un tipo de clase con un constructor predeterminado proporcionado por el usuario, ese constructor se llama.
- Si
T
es un tipo de clase con un = default
constructor predeterminado definido implícitamente o ed, el objeto se inicializa en cero y luego se llama al constructor predeterminado.
- Si
T
es a std::initializer_list
, el valor de retorno es una lista de este tipo vacía.
- De lo contrario (
T
es decir, es un tipo que no es de clase; los tipos de retorno no pueden ser matrices), el valor de retorno se inicializa en cero.