VS2012在使用+ [] {}巫术时抱怨

时间:2016-11-06 20:42:20

标签: c++11 templates visual-studio-2012 lambda

我希望在使用lambdas时自动扣除接受函数的模板化函数的参数。此示例显示了我的一些选项:

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使用了我在这里学到的技巧:Obtaining function pointer to lambda?。所以实际上我应该对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"

1 个答案:

答案 0 :(得分:1)

这与this bug有关(关闭为&#34;按设计&#34;)。 VC ++支持x86上的几个调用约定,而带有空捕获列表的lambdas则为它们提供转换。这就是为什么会出现歧义。

不幸的是,没有列出的解决方法,您还没有尝试过。

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

中列为已修复