Buscar..


Sintaxis

  • function_name ([ function_args ]) [ function_attributes ] [ function_qualifiers ] -> trailing-return-type [ require_clause ]

Observaciones

La sintaxis anterior muestra una declaración de función completa que utiliza un tipo final, donde los corchetes indican una parte opcional de la declaración de función (como la lista de argumentos si es una función sin argumento).

Además, la sintaxis del tipo de retorno final prohíbe la definición de una clase, unión o tipo de enumeración dentro de un tipo de retorno final (tenga en cuenta que esto tampoco está permitido en un tipo de retorno inicial). Aparte de eso, los tipos pueden escribirse de la misma manera después de -> como sería en cualquier otro lugar.

Evite calificar un nombre de tipo anidado

class ClassWithAReallyLongName {
  public:
    class Iterator { /* ... */ };
    Iterator end();
};

Definiendo el end del miembro con un tipo de retorno final:

auto ClassWithAReallyLongName::end() -> Iterator { return Iterator(); }

Definiendo el end del miembro sin un tipo de retorno final:

ClassWithAReallyLongName::Iterator ClassWithAReallyLongName::end() { return Iterator(); }

El tipo de retorno final se busca en el alcance de la clase, mientras que el tipo de retorno inicial se busca en el ámbito de espacio de nombres adjunto y, por lo tanto, puede requerir una calificación "redundante".

Expresiones lambda

Un lambda solo puede tener un tipo de retorno final; la sintaxis de tipo de retorno inicial no es aplicable a las lambdas. Tenga en cuenta que en muchos casos no es necesario especificar un tipo de retorno para un lambda en absoluto.

struct Base {};
struct Derived1 : Base {};
struct Derived2 : Base {};
auto lambda = [](bool b) -> Base* { if (b) return new Derived1; else return new Derived2; };
// ill-formed: auto lambda = Base* [](bool b) { ... };


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow