- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有下面的程序:
#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)
的问题是你演绎的F
作为函数类型,因此它不会衰减为函数指针。相反,您会获得对函数的引用。然后是result_of<F()>
表达式无效,因为 F()
是 int()()
即返回函数的函数,该函数在 C++ 中不是有效类型(函数可以返回指向函数的指针,或对函数的引用,但不能返回函数)。
如果您使用 result_of<F&()>
它将起作用无论如何,这更准确,因为这就是您调用可调用对象的方式。内call(F& f)
你做f()
在这种情况下 f
是左值,所以你应该问调用左值的结果是什么 F
没有参数是,否则你可能会得到错误的答案。考虑:
struct S {
double operator()()& {return 0.0;}
void operator()()&& { }
};
result_of<F()>::type
是
void
,这不是您想要的答案。
result_of<F&()>
那么你就得到了正确的答案,它也适用于
F
是函数类型,所以
call(f)
也有效。
(3) As long as I know, any token with a name, like variable/function, should be considered a l-value. And in the case of function parameter, compiler should "decay" my function name "f" to a function pointer, right?
call(F&)
函数通过引用获取其参数,因此没有衰减。
(4) This is like decaying an array and pass it to a function----And a function pointer could be an l-value, then what's wrong with "call(F& f)"?
call(F f)
不是
call(F& f)
.但即使你这样做,你仍然需要使用
result_of
正确获得
f()
的结果哪里
f
是一个左值。
关于function - C++11:为什么 result_of 可以接受仿函数类型作为 lvalue_reference,但不能接受函数类型作为 lvalue_reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38118563/
我有下面的程序: #include #include using namespace std; template ::type> R call(F& f) { return f(); } struct
我是一名优秀的程序员,十分优秀!