1

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

为什么不允许这种用法?

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

4

1 回答 1

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);
}
于 2013-09-05T05:22:10.757 回答