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
中列为已修复
我想要在使用 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 使用了我在这里学到的技巧:
对于这个问题有任何解决方法或建议吗?
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
中列为已修复