Это все в сообщении об ошибке:
примечание: ожидается тип, получил 'std :: tie'
invoke_result
метафункция, которая принимает набор типов .std::tie()
- это шаблон функции - это не тип.И это даже не объект, поэтому вы тоже не можете сделать invoke_result<decltype(std::tie), Args...>
.
То, что дает invoke_result
, - это один синтаксис, который работает для всех видов вызываемых объектов.Но вам не нужно это с std::tie
- это шаблон функции, поэтому вы можете просто напрямую вызывать его в неоцененном контексте:
template <typename... Args>
using X = decltype(std::tie(std::declval<Args>()...));
Примечание. Если вам действительно не нужна метафункция, просто используйте псевдоним _t
.То есть std::invoke_result_t<...>
, а не std::invoke_result<...>::type
.Последнее в любом случае неверно, так как вы пропускаете ключевое слово typename
- и псевдоним устраняет необходимость.