#include <functional>
int f(int x)
{
return 0;
}
int main()
{
std::function<int(int)> fn1 = f; // ok
std::function<int(int)> fn2 = static_cast<int(*)(int)>(f); // ok
//
// error C2066: cast to function type is illegal
//
std::function<int(int)> fn3 = static_cast<int(int)>(f);
}
我的C ++编译器是VS 2015 Update 3。
我只是想知道:
为什么C ++标准不允许std::function<int(int)> fn3 = static_cast<int(int)>(f);
?
背后的理由是什么?
答案 0 :(得分:3)
这可能是因为您不能拥有函数类型的对象(在标准中使用的对象的定义下:存储区域)。演员需要创建int(int)
类型的对象,但是你不能拥有那种类型的对象(函数不是对象)。
但是,您可以转换为函数指针,因为您可以拥有函数指针类型的对象。实际上,static_cast
的函数参数在被转换为现在相同类型之前已经衰减到函数指针(就像数组很容易衰减到指针一样)。这是因为[expr.static.cast] / 8:
左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)转换应用于操作数。
长话短说,fn2
相当于fn1
并且使用了多余的强制转换,因为f
在初始化fn1
时已经转换为函数指针。