我有下面的程序:
#include<type_traits>
#include<iostream>
using namespace std;
template <class F, class R = typename result_of<F()>::type>
R call(F& f) { return f(); }
struct S {
double operator()(){return 0.0;}
};
int f(){return 1;}
int main()
{
S obj;
call(obj);//ok
call(f);//error!
return 0;
}
它无法在“call(f)”行中编译。奇怪的是“call(obj)”没问题。
(1) 我在另一个线程C++11 result_of deducing my function type failed中有一个类似的帖子。但这并没有说明为什么函子对象可以,而函数却不行。
(2) 我不确定这是否与“R call(F&f)”有关:函数类型不能声明左值?
(3) 据我所知,任何有名字的记号,比如变量/函数,都应该被认为是左值。在函数参数的情况下,编译器应该将我的函数名“f”“衰减”为函数指针,对吧?
(4) 这就像衰减一个数组并将其传递给一个函数----并且函数指针可以是一个左值,那么“调用(F&f)”有什么问题?
您能否就“为什么”是我的情况提供进一步的解释,我在哪里做错了?谢谢。