xml*_*lmx 1 c++ lambda compiler-errors c++11
我的编译器是最新的VC++ 2013预览版.(更新了!)
#include <new>
struct A
{
A(int)
{}
};
void f(void (*fn)(void*))
{
A a(0);
fn(&a);
}
int main()
{
int n = 0;
auto fn = [&](void* p)
{
//
// error C2664: 'void f(void (__cdecl *)(void *))' :
// cannot convert parameter 1 from
// 'main::<lambda_b20f735b061d78dbb0f2f653ecbb482f>'
// to 'void (__cdecl *)(void *)'
//
new (p) A(n);
};
f(fn);
}
Run Code Online (Sandbox Code Playgroud)
为什么不允许这种用法?
这种行为是由标准定义的吗?如果是的话,理由是什么?
void f(void (*fn)(void*))
Run Code Online (Sandbox Code Playgroud)
采用函数指针,而不是lambda.
auto fn = [&](void* p)
Run Code Online (Sandbox Code Playgroud)
是一个lambda,并且不能简化为函数指针,因为它涉及捕获.
void f(std::function<void(void*)> fn)
Run Code Online (Sandbox Code Playgroud)
#include <functional>
struct A
{
A(int)
{}
};
void f(std::function<void(void*)> fn)
{
A a(0);
fn(&a);
}
int main()
{
int n = 0;
auto fn = [&](void* p)
{
//
// error C2664: 'void f(void (__cdecl *)(void *))' :
// cannot convert parameter 1 from
// 'main::<lambda_b20f735b061d78dbb0f2f653ecbb482f>'
// to 'void (__cdecl *)(void *)'
//
new (p) A(n);
};
f(fn);
}
Run Code Online (Sandbox Code Playgroud)