C++
Tipo di ritorno finale
Ricerca…
Sintassi
- function_name ([ function_args ]) [ function_attributes ] [ function_qualifiers ]
->
trailing-return-type [ requires_clause ]
Osservazioni
La sintassi precedente mostra una dichiarazione di funzione completa utilizzando un tipo finale, in cui le parentesi quadre indicano una parte facoltativa della dichiarazione di funzione (come la lista di argomenti se una funzione no-arg).
Inoltre, la sintassi del tipo di ritorno finale non consente di definire un tipo di classe, unione o enum all'interno di un tipo di ritorno finale (si noti che questo non è consentito neanche in un tipo di ritorno iniziale). Oltre a questo, i tipi possono essere scritti allo stesso modo dopo il ->
come sarebbero altrove.
Evitare di qualificare un nome di tipo nidificato
class ClassWithAReallyLongName {
public:
class Iterator { /* ... */ };
Iterator end();
};
Definizione del membro end
con un tipo di ritorno finale:
auto ClassWithAReallyLongName::end() -> Iterator { return Iterator(); }
Definizione della end
del membro senza un tipo di ritorno finale:
ClassWithAReallyLongName::Iterator ClassWithAReallyLongName::end() { return Iterator(); }
Il tipo di ritorno finale viene cercato nell'ambito della classe, mentre un tipo di ritorno iniziale viene ricercato nell'ambito del namespace che lo racchiude e può quindi richiedere una qualifica "ridondante".
Espressioni Lambda
Un lambda può avere solo un tipo di ritorno finale; la sintassi principale del tipo di ritorno non è applicabile a lambdas. Si noti che in molti casi non è necessario specificare un tipo di ritorno per una lambda.
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) { ... };