Ответ 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)
, вам нужен новый синтаксис.