我希望在使用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"
答案 0 :(得分:1)
这与this bug有关(关闭为&#34;按设计&#34;)。 VC ++支持x86上的几个调用约定,而带有空捕获列表的lambdas则为它们提供转换。这就是为什么会出现歧义。
不幸的是,没有列出的解决方法,您还没有尝试过。
顺便说一句,此错误在Visual C++ 2015 Update 2
中列为已修复