VS2012 在使用 +[]{} 魔法时抱怨

VS2012 complains when using +[]{} sorcery

我想要在使用 lambda 时自动推导接受函数的模板函数的参数。这个例子展示了我的一些选择:

template <class T>
void foo(void (*func)(T)) {
    T val;
    // do something with val and func...
}

int main() {
    auto pfunc0         =  [] (int) { /*...*/ };
    void (*pfunc1)(int) =  [] (int) { /*...*/ };
    auto* pfunc2        = +[] (int) { /*...*/ };

    foo(pfunc0);      // not ok
    foo<int>(pfunc0); // ok, but redundant
    foo(pfunc1);      // ok, but redundant
    foo(pfunc2);      // ok
}

pfunc2 使用了我在这里学到的技巧:。所以实际上我应该对 pfunc2 案例感到满意,因为它是简洁且不重复的代码,不幸的是 Visual C++ 2012 IDE 抱怨它是错误的代码,即使它编译得很好。

对于这个问题有任何解决方法或建议吗?

IDE 错误信息:

在 "auto* pfunc2" 行中: IDE 加下划线 'auto' 并表示

Error: cannot deduce 'auto' type

还在它抱怨的地方加下划线“[”

Error: more than one conversion function from "lambda[]void (int)->void" to a build-in type applies:
function "lambda[]void (int)->void::operator void (*)(int)() const"  
function "lambda[]void (int)->void::operator void (*)(int)() const"  
function "lambda[]void (int)->void::operator void (*)(int)() const"

这与 this bug 有关(关闭为 "by design")。 VC++ 支持 x86 上的多种调用约定,带有空捕获列表的 lambda 提供对它们的所有转换。这就是为什么会有歧义。

遗憾的是,没有列出您尚未尝试过的解决方法。

顺便说一下,此错误在 Visual C++ 2015 Update 2

中列为已修复