Я провел некоторое исследование std::result_of<>
и знаю, как он используется на высоком уровне, но я все еще довольно запутался в этой волшебной вещи.
Итак, если я правильно понимаю, форма R (Args..)
должна интерпретироваться компилятором как тип функции, принимающий аргументы типов Args...
и возвращающий тип R
, и использование очень оправдано при указании std::function<int(int)>
, который объявляет тип функции, принимающий int
в качестве единственного аргумента и возвращает int
.
Однако значение вышеизложенного внезапно меняется, когда то же самое понятие используется в контексте std::result_of<F(Args...)>
(обратите внимание, что я изменил R
на F
и удалил (space) between
F
и (
, чтобы обозначить разницу - согласно cppreference, значение F(Args...)
становится время компиляции INVOKE
выражение - я имею в виду, я как бы понимаю, что основная цель std::result_of<F(Args...)>
состоит в том, чтобы использовать понятие INVOKE
для выбора правильной перегрузки (если присутствует более одной перегрузки) и, конечно же, вывести возвращаемый тип такого вызова (во время разрешения компиляции) - фактически это будет примерно похоже на: decltype(std::declval<F>()(std::declval<Args>()...))
- однако понятие F (Args...)
- по сравнению с случаем std::function<R (Args...)>
- будет интерпретировано компилятором как тип функции, принимающий Args...
и возвращающий тип F
, где теперь F
— это тип функции, возвращаемый тип которой мы пытаемся получить!
Конечно, с помощью decltype
и std::declval
реализация std::result_of
кажется разумной, но я читал, что boost каким-то образом реализовал result_of
в C++98/03, где decltype
и std::declval
не существовало - мне интересно, как это возможно (может быть, с некоторыми очень хакерскими трюками)?
Итак, еще раз: является ли понятие R (Args...)
в контексте того, что аргумент шаблона всегда интерпретируется/выводится как тип функции с типом возвращаемого значения R
, независимо от того, является ли закрывающий шаблон std::function<>
или std::result_of<>
? в то время как std::result_of<>
каким-то образом переосмысливает «тип возвращаемого значения» F
и «возвращает» фактический тип возвращаемого значения, определенный std::result_of<F(Args...)>::type
? Или std::result_of<F(Args...)>
просто интерпретирует F(Args...)
по-другому, поэтому знает, что это магическое INVOKE
выражение?
Спасибо за ваше предстоящее разъяснение!
std::result_of
просто злоупотребляет синтаксисом типа функции, и, как говорится в в этом примечании , Это не всегда работает. - person cpplearner   schedule 13.06.2018