return {};
significa que {}
é o inicializador para o valor de retorno . O valor de retorno é inicializado em lista com uma lista vazia.
Aqui estão algumas informações básicas sobre o valor de retorno , com base em [stmt.return] no padrão C ++:
Para uma função que retorna por valor (ou seja, o tipo de retorno não é uma referência e não void
), existe um objeto temporário chamado valor de retorno . Este objeto é criado pela return
instrução e seus inicializadores dependem do que estava na instrução return.
O valor de retorno sobrevive até o final da expressão completa no código que chamou a função; se tiver tipo de classe, seu destruidor será executado, a menos que tenha o tempo de vida estendido pelo chamador ligando uma referência diretamente a ele.
O valor de retorno pode ser inicializado de duas maneiras diferentes:
return some_expression;
- o valor de retorno é inicializado com cópia desome_expression
return { possibly_empty_list };
- o valor de retorno é
inicializado em lista a partir da lista.
Supondo que T
seja o tipo de retorno da função, observe que return T{};
é diferente de return {}
: no primeiro, um temporário T{}
é criado e, em seguida, o valor de retorno é inicializado por cópia desse temporário.
Não será possível compilar se T
não houver um construtor de cópia / movimentação acessível, mas return {};
terá êxito mesmo se esses construtores não estiverem presentes. Consequentemente, return T{};
pode mostrar efeitos colaterais do construtor de cópia, etc., embora este seja um contexto de elisão de cópia, então pode não mostrar.
Aqui está uma breve recapitulação da inicialização de lista em C ++ 14 (N4140 [dcl.init.list] / 3), onde o inicializador é uma lista vazia:
- Se
T
for um agregado, então cada membro é inicializado a partir de seu inicializador de chave ou igual, se houver um, caso contrário, como se por {}
(portanto, aplique essas etapas recursivamente).
- Se
T
for um tipo de classe com um construtor padrão fornecido pelo usuário, esse construtor é chamado.
- Se
T
for um tipo de classe com um = default
construtor padrão definido implicitamente ou ed, o objeto será inicializado com zero e o construtor padrão será chamado.
- Se
T
for um std::initializer_list
, o valor de retorno é uma lista vazia.
- Caso contrário (ou
T
seja, não é um tipo de classe - os tipos de retorno não podem ser matrizes), o valor de retorno é inicializado com zero.