Hay ciertos casos en los que debe utilizar un tipo de retorno final. En particular, un tipo de retorno lambda, si se especifica, debe especificarse mediante un tipo de retorno final. Además, si su tipo de retorno utiliza un decltype
que requiere que los nombres de los argumentos estén dentro del alcance, se debe usar un tipo de retorno final (sin embargo, generalmente se puede usar declval<T>
para solucionar este último problema).
El tipo de retorno final tiene otras ventajas menores. Por ejemplo, considere una definición de función miembro no en línea utilizando la sintaxis de función 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
{
}
Las definiciones de tipo de miembro no están dentro del alcance hasta que el nombre de la clase aparece antes ::get_integers
, por lo que tenemos que repetir la calificación de la clase dos veces. Si usamos un tipo de retorno final, no necesitamos repetir el nombre del tipo:
auto my_awesome_type::get_integers() const -> integer_sequence
{
}
En este ejemplo, no es tan importante, pero si tiene nombres de clase largos o funciones miembro de plantillas de clase que no están definidas en línea, entonces puede marcar una gran diferencia en la legibilidad.
En su sesión "Fresh Paint" en C ++ Now 2012, Alisdair Meredith señaló que si usa tipos de retorno finales de manera consistente, los nombres de todas sus funciones se alinean ordenadamente:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
He usado tipos de retorno finales en todas partes en CxxReflect , por lo que si está buscando un ejemplo de cómo se ve el código usándolos de manera consistente, puede echar un vistazo allí (por ejemplo, la type
clase ).
decltype
los argumentos.