我的编译器是最新的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);
}
为什么不允许这种用法?
此行为是否由标准定义?如果是的话,理由是什么?
答案 0 :(得分:8)
void f(void (*fn)(void*))
采用函数指针,而不是lambda。
auto fn = [&](void* p)
是一个lambda,不能简化为函数指针,因为它涉及捕获。
void f(std::function<void(void*)> fn)
#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);
}