C++
Обратный тип возврата
Поиск…
Синтаксис
- function_name ([ function_args ]) [ function_attributes ] [ function_qualifiers ]
->
trailing-return-type [ require_clause ]
замечания
Вышеприведенный синтаксис показывает объявление полной функции с использованием конечного типа, где квадратные скобки указывают необязательную часть объявления функции (например, список аргументов, если функция no-arg).
Кроме того, синтаксис возвращаемого типа возврата запрещает определять тип класса, union или enum внутри возвращаемого возвращаемого типа (обратите внимание, что это также недопустимо в первом типе возврата). Помимо этого, типы могут быть записаны таким же образом после ->
как и в других местах.
Избегайте квалифицировать вложенное имя типа
class ClassWithAReallyLongName {
public:
class Iterator { /* ... */ };
Iterator end();
};
Определение end
элемента с возвращаемым типом возврата:
auto ClassWithAReallyLongName::end() -> Iterator { return Iterator(); }
Определение end
элемента без возвращаемого типа возврата:
ClassWithAReallyLongName::Iterator ClassWithAReallyLongName::end() { return Iterator(); }
Возвращаемый тип возвращаемого типа просматривается в классе класса, в то время как ведущий тип возвращаемого значения просматривается в охватывающей области пространства имен и поэтому может потребовать «избыточной» квалификации.
Лямбда-выражения
Лямбда может иметь только возвращаемый тип возврата; синтаксис исходного типа возврата не применим к lambdas. Обратите внимание, что во многих случаях нет необходимости указывать тип возврата для лямбды вообще.
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) { ... };