Cru*_*row 0 c++ lambda c++11 visual-studio-2012
我有以下代码:
#include <functional>
//...
typedef int (*Myfun)(int);
std::function<int (int)> fn0([](int a)->int {
return -a;
});
std::cout << "val == " << fn0(3) << std::endl; //"val == -3"
Myfun *fptr = fn0.target<Myfun>(); //fptr is NULL!!
std::cout << "val == " << (*fptr)(3) << std::endl; //Access violation error
Run Code Online (Sandbox Code Playgroud)
实际上,这段代码是来自MSDN的代码,稍有改动:使用lambda而不是普通函数.
为什么调用fn0.target<Myfun>()返回NULL?
当我宣布一个常规功能
int neg(int val) {
return (-val);
}
Run Code Online (Sandbox Code Playgroud)
并写std::function<int (int)> fn0(neg);,一切似乎都有效,但lambda没有得到正确处理.
类型Myfunfrom typedef int (*Myfun)(int);与函数的目标类型无关,它是通过执行表达式生成的闭包对象的唯一,未命名类型[](int a)->int { return -a; }
尝试执行std::cout << fn0.target_type().name() << '\n';以查看自己.
当你用一个函数声明一个函数时int neg(int val) { return (-val); },它的类型neg就是Myfun(在函数到指针转换之后发生std::function<int(int)> fn0(neg)),这就是为什么std::function::target()能够返回指向它的指针.
| 归档时间: |
|
| 查看次数: |
242 次 |
| 最近记录: |