我确实对std::result_of<>
.
因此,如果我理解正确,R (Args..)
编译器应该将表单解释为采用类型参数Args...
和返回类型的函数类型R
,并且在指定时使用非常合理std::function<int(int)>
,它声明了一个函数类型int
作为其唯一参数,并返回int
。
但是,当在上下文中使用相同的概念时,上面的含义突然发生了变化std::result_of<F(Args...)>
(注意,我更改R
为F
,并删除了 and之间的(空格)以表示差异-根据 cppreference, 的含义变成了编译时间表达式 - 我的意思是,我有点理解 的主要目的是使用 的概念来选择正确的重载(如果存在多个重载),当然还可以推断出这种调用的返回类型(在编译时解析期间) - 实际上,这大致类似于:- 但是,- 与
F
(
F(Args...)
INVOKE
std::result_of<F(Args...)>
INVOKE
decltype(std::declval<F>()(std::declval<Args>()...))
F (Args...)
std::function<R (Args...)>
case - 编译器会解释为一个函数类型,接受Args...
并返回类型F
,现在F
是我们试图获取返回类型的函数类型!
当然,在 and 的帮助下decltype
,std::declval
实现std::result_of
似乎是合理的,但是我读到了result_of
在 C++98/03 中以某种方式实现的 boostdecltype
并且std::declval
不存在 - 我想知道这怎么可能(也许有一些非常 hack '小把戏)?
所以重新迭代: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
表达?
感谢您即将进行的澄清!