Я получил следующий код в качестве эксперимента:
int f1() { return 0; }
struct Bar {
Bar() = delete;
int f() { return 0; }
int operator()() { return 1; }
};
int main()
{
decltype(f1()) x = 3;//f1() is expression
result_of<decltype(&f1)()>::type x1 = 3;//type+param
result_of<Bar()>::type x3 = 3;//type+param
decltype(declval<Bar>().f()) y = 4;//expression
decltype((((Bar*)nullptr)->*(&Bar::f))()) z = 5;//expression
result_of<decltype(std::mem_fn(&Bar::f))()>::type y2 = 3;//error!!!!!!
}
Все ок, кроме последнего result_of
:
Я пытался получить тип возврата Bar::f
, с помощью result_of
,
Почему это не удалось, и как это исправить?
неопределенные тип возврата mem_fn
:
шаблон <класс R, класс T> неопределенные mem_fn (R T :: * pm) noexcept;
определяется с точки зрения INVOKE
[Func.memfn] / р1:
1 Возвращает: Простая оболочка вызова ([Func.def])
fn
такое что выражениеfn(t, a2, ..., aN)
эквивалентноINVOKE(pm, t, a2, ..., aN)
([Func.require]).
где определение INVOKE
включает в себя следующие две пули [Func.require] / р1:
определять
INVOKE(f, t1, t2, ..., tN)
следующее:—
(t1.*f)(t2, ..., tN)
когдаf
указатель на функцию-член классаT
а такжеis_base_of<T, decay_t<decltype(t1)>>::value
являетсяtrue
;—
((*t1).*f)(t2, ..., tN)
когдаf
указатель на функцию-член классаT
а такжеt1
не удовлетворяет двум предыдущим пунктам;
То есть первый аргумент того, что mem_fn
return должен быть типом неявного параметра объекта (t1
), либо ссылка, либо указатель, например:
std::result_of<decltype(std::mem_fn(&Bar::f))(Bar&)>::type y2;
// ~~~^
std::result_of<decltype(std::mem_fn(&Bar::f))(Bar*)>::type y2;
// ~~~^
Вы также можете удалить std::mem_fn
в целом:
std::result_of<decltype(&Bar::f)(Bar*)>::type y2;
Других решений пока нет …