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) { ... };


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow