std :: invoke_result на std :: tie - PullRequest
0 голосов
/ 04 марта 2019

Я использую GCC 7.3 с C ++ 17, и я не понимаю, почему эта строка не работает:

template <typename... Args>
using X = std::invoke_result<std::tie, Args...>::type;

Ошибка:

error: type/value mismatch at argument 1 in template 
parameter list for ‘template<class _Functor, class ... _ArgTypes> 
struct std::invoke_result’
using X = std::invoke_result<std::tie, Args...>::type;
note:   expected a type, got ‘std::tie’

1 Ответ

0 голосов
/ 04 марта 2019

Это все в сообщении об ошибке:

примечание: ожидается тип, получил '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 - и псевдоним устраняет необходимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...