在lambda表达式或编译器错误中是不允许使用:: operator new?(更新!)

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)

为什么不允许这种用法?

这种行为是由标准定义的吗?如果是的话,理由是什么?

kfs*_*one 8

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)

将工作.http://ideone.com/E7vvyW

#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)