std::is_invocable<std::decay_t<void(int&)>, std::decay_t<int>>::value
оценивается как ложное.
Но
void(int&)
распадается до void*(int&)
и int
до int
и я могу использовать std::invoke
вот так:
void f(int&);
...
auto* fp = f;
int i = 0;
std::invoke(fp, i);
Я наткнулся на это, когда смотрел на конструктор std::thread
:
template<typename _Callable, typename... _Args,
typename = _Require<__not_same<_Callable>>>
explicit
thread(_Callable&& __f, _Args&&... __args)
{
static_assert( __is_invocable<typename decay<_Callable>::type,
typename decay<_Args>::type...>::value,
"std::thread arguments must be invocable after conversion to rvalues"
);
Я понимаю, почему передача ссылок на * Конструктор 1022 * обескуражен (мы все еще можем использовать std::ref()
), но я не могу понять, почему void *(int&)
нельзя вызывать с int
.