O que significa a declaração
return {};
em C ++ 11 indicar e quando usá-lo em vez de (digamos)
return NULL;
ou
return nullptr;
O que significa a declaração
return {};
em C ++ 11 indicar e quando usá-lo em vez de (digamos)
return NULL;
ou
return nullptr;
return;
sem valor?return;
Por outro lado,return{};
é válido se você tiver um tipo de retorno.Respostas:
return {};
indica "retornar um objeto do tipo de retorno da função inicializado com um inicializador de lista vazio ". O comportamento exato depende do tipo do objeto retornado.De cppreference.com (como o OP está marcado como C ++ 11, excluí as regras em C ++ 14 e C ++ 17; consulte o link para obter mais detalhes):
Antes do C ++ 11, para uma função que retorna a
std::string
, você teria escrito:Usando a sintaxe de chaves em C ++ 11, você não precisa repetir o tipo:
return NULL
ereturn nullptr
deve ser usado quando a função retorna um tipo de ponteiro:No entanto,
NULL
está obsoleto desde C ++ 11 porque é apenas um alias para um valor inteiro (0), enquantonullptr
é um tipo de ponteiro real:fonte
Isso provavelmente é confuso:
Provavelmente não é:
fonte
initializer_list
construtor, ele não seria usado se nenhum construtor padrão estivesse disponível?return {}
NÃO é equivalente areturn SomeObjectWithADefaultConstructor{};
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 pelareturn
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 quereturn T{};
é diferente dereturn {}
: no primeiro, um temporárioT{}
é 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, masreturn {};
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:
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).T
for um tipo de classe com um construtor padrão fornecido pelo usuário, esse construtor é chamado.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.T
for umstd::initializer_list
, o valor de retorno é uma lista vazia.T
seja, não é um tipo de classe - os tipos de retorno não podem ser matrizes), o valor de retorno é inicializado com zero.fonte
{}
, que pode ou não ser valor-init.É uma espécie de atalho para uma nova instância do tipo de retorno de métodos.
fonte