Existem certos casos em que você deve usar um tipo de retorno à direita. Mais notavelmente, um tipo de retorno lambda, se especificado, deve ser especificado por meio de um tipo de retorno à direita. Além disso, se o seu tipo de retorno utiliza um decltype
que requer que os nomes dos argumentos estejam no escopo, um tipo de retorno final deve ser usado (no entanto, pode-se usar normalmente declval<T>
para contornar este último problema).
O tipo de retorno à direita tem algumas outras vantagens secundárias. Por exemplo, considere uma definição de função de membro não embutida usando a sintaxe de função tradicional:
struct my_awesome_type
{
typedef std::vector<int> integer_sequence;
integer_sequence get_integers() const;
};
my_awesome_type::integer_sequence my_awesome_type::get_integers() const
{
}
Os typedefs de membros não estão no escopo até que o nome da classe apareça antes ::get_integers
, então temos que repetir a qualificação da classe duas vezes. Se usarmos um tipo de retorno final, não precisamos repetir o nome do tipo:
auto my_awesome_type::get_integers() const -> integer_sequence
{
}
Neste exemplo, não é um grande negócio, mas se você tiver nomes de classe longos ou funções de membro de modelos de classe que não são definidos inline, isso pode fazer uma grande diferença na legibilidade.
Em sua sessão "Fresh Paint" no C ++ Now 2012, Alisdair Meredith apontou que se você usar tipos de retorno à direita de forma consistente, os nomes de todas as suas funções se alinham perfeitamente:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
Eu usei tipos de retorno à direita em todos os lugares em CxxReflect , então se você estiver procurando por um exemplo de como o código fica usando-os consistentemente, você pode dar uma olhada lá (por exemplo, a type
classe ).
decltype
argumentos.