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

时间:2013-09-05 03:33:43

标签: c++ c++11 lambda compiler-errors

我的编译器是最新的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);
}

为什么不允许这种用法?

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

1 个答案:

答案 0 :(得分:8)

void f(void (*fn)(void*))

采用函数指针,而不是lambda。

auto fn = [&](void* p)

是一个lambda,不能简化为函数指针,因为它涉及捕获。

void f(std::function<void(void*)> fn)

会奏效。 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);
}