Обратите внимание, что вы можете использовать auto
:
auto f = task.get_future();
И все работает как положено.
decltype
используется для определения типа выражения.В этом случае bar(int)
не является допустимым выражением.Вы можете использовать decltype(bar(0))
.
В качестве альтернативы, вы можете использовать специальные инструменты для определения результата вызова функции.Поскольку вы пометили c ++ 11 , вы можете использовать typename std::result_of<decltype(bar)*(int)>::type
(конечно, вам нужно #include <type_traits>
).
Для будущих читателей: я быхотелось бы ответить на этот вопрос в перспективе c ++ 17 .result_of
ожидает аргумент шаблона в форме F(Args...)
, который страдает, так как тип функции является типом возврата и крайне ограничен.В c ++ 17 введено invoke_result
, и оно намного лучше, чем result_of
: std::invoke_result_t<decltype(bar), int>
.Очень интуитивно понятно