C++11 применяет result_of к функции-члену, не удалось, почему?

Я получил следующий код в качестве эксперимента:

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,

Почему это не удалось, и как это исправить?

1 ответ

Неуказанный тип возвращаемого значения mem_fn:

шаблон <класс R, класс T>не указано mem_fn(R T::* pm) noexcept;

определяется с точки зрения INVOKE [func.memfn] / p1:

1 Возвращает: простая оболочка вызова ( [func.def]) fn такое что выражение fn(t, a2, ..., aN) эквивалентно INVOKE(pm, t, a2, ..., aN) ( [func.require]).

где определение INVOKE включает в себя следующие две марки [func.require] / p1:

определять 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;
Другие вопросы по тегам