C++ lambda表达式或编译器错误中是否不允许使用::运算符new?(更新!)

C++ lambda表达式或编译器错误中是否不允许使用::运算符new?(更新!),c++,c++11,lambda,compiler-errors,C++,C++11,Lambda,Compiler Errors,我的编译器是最新的VC++2013预览版。(已更新!) #包括 结构A { A(整数) {} }; 无效f(无效(*fn)(无效*) { A(0); fn&a; } int main() { int n=0; 自动fn=[&](无效*p) { // //错误C2664:“void f(void(u cdecl*)(void*)”: //无法从转换参数1 //'main::' //至“作废(uu cdecl*)(作废*)” // 新(p)A(n); }; f(fn); } 为什么不允许这种用法

我的编译器是最新的VC++2013预览版。(已更新!

#包括
结构A
{
A(整数)
{}
};
无效f(无效(*fn)(无效*)
{
A(0);
fn&a;
}
int main()
{
int n=0;
自动fn=[&](无效*p)
{
//
//错误C2664:“void f(void(u cdecl*)(void*)”:
//无法从转换参数1
//'main::'
//至“作废(uu cdecl*)(作废*)”
//
新(p)A(n);
};
f(fn);
}
为什么不允许这种用法

该行为是否由标准定义?如果是,理由是什么

void f(void (*fn)(void*))
接受函数指针,而不是lambda

auto fn = [&](void* p)
是lambda,不能简化为函数指针,因为它涉及捕获

void f(std::function<void(void*)> fn)
void f(标准::函数fn)
会有用的

#包括
结构A
{
A(整数)
{}
};
空f(标准::函数fn)
{
A(0);
fn&a;
}
int main()
{
int n=0;
自动fn=[&](无效*p)
{
//
//错误C2664:“void f(void(u cdecl*)(void*)”:
//无法从转换参数1
//'main::'
//至“作废(uu cdecl*)(作废*)”
//
新(p)A(n);
};
f(fn);
}
接受函数指针,而不是lambda

auto fn = [&](void* p)
是lambda,不能简化为函数指针,因为它涉及捕获

void f(std::function<void(void*)> fn)
void f(标准::函数fn)
会有用的

#包括
结构A
{
A(整数)
{}
};
空f(标准::函数fn)
{
A(0);
fn&a;
}
int main()
{
int n=0;
自动fn=[&](无效*p)
{
//
//错误C2664:“void f(void(u cdecl*)(void*)”:
//无法从转换参数1
//'main::'
//至“作废(uu cdecl*)(作废*)”
//
新(p)A(n);
};
f(fn);
}

您是否包含了
#?Placement new不是由编译器神奇地预定义的,它实际上是在标准头中定义的常规函数。捕获lambda是不同的。请使用而不是函数指针。@xmllmx,是的,它在标准中定义得很好,基本原理是常识。函数指针不能存储状态,那么您建议用什么干净的方法来传输捕获的变量呢?@xmllmx捕获lambda几乎相当于一个包含成员和运算符()的结构,可以使用参数,也可以不使用参数。是否包含了?Placement new不是由编译器神奇地预定义的,它实际上是在标准头中定义的常规函数。捕获lambda是不同的。请使用而不是函数指针。@xmllmx,是的,它在标准中定义得很好,基本原理是常识。函数指针不能存储状态,那么您建议用什么干净的方法来传输捕获的变量呢?@xmllmx捕获lambda几乎相当于一个包含成员和运算符()的结构,成员和运算符()可以使用参数,也可以不使用参数。