Подтвердить что ты не робот

Что такое "->" после объявления функции?

В одном системном заголовочном файле я вижу выражение, подобное этому:

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{...}

Я не знаю, что означает "- > ", это не выражение указателя или лямбда-выражения, может ли кто-нибудь мне помочь?

4b9b3361

Ответ 1

Это синтаксис объявления новой функции из С++ 11, и он называется "возвращаемым типом возврата". В конце объявления функции -> означает, что следующий тип возвращаемой функции. Он может использоваться только тогда, когда используется ключевое слово auto вместо фактического типа возврата, где вы обычно ожидаете его.

Например, эти два объявления совместимы:

int foo();
auto foo() -> int;

В зависимости от ваших вкусов вы можете найти его более симпатичным, чем старый синтаксис объявления, особенно когда тип возврата чрезвычайно длинный/сложный:

task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param);
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>;

Но иногда это может быть необходимо с шаблонами, когда возвращаемый тип функции может меняться с аргументами.

Предположим, что вы хотите, чтобы функция templated добавляла переменные:

template<typename T>
T add(const T& x, const T& y)
{
    return x + y;
}

Это здорово, но вы сможете добавлять только переменные того же типа. Предположим, вы хотели бы добавить переменные любого типа (например, add((int)1, (double)2)).

template<typename T, typename U>
??? add(const T& x, const U& y)
{
    return x + y;
}

Проблема заключается в том, что вы не можете заранее сказать, каким будет тип результата x + y. Поскольку шаблоны стоят, они могут даже быть нецелыми типами. (Не хотите ли вы сделать add(std::string("x"), "y")?)

Decltype, наряду с синтаксисом объявления новой функции, позволяет решить эту проблему.

template<typename T, typename U>
auto add(const T& x, const U& y) -> decltype(x + y)
{
    return x + y;
}

Decltype "возвращает" тип выражения. Поскольку вам нужно x и y для работы с decltype(x + y), вам нужен новый синтаксис.