我正在查看的一段代码将一些对 DLL 中函数的调用封装到立即执行的 lambda 中:
try {
[] { call_a_function(); } ();
}
catch (const char* msg) {
//...
}
我不明白为什么这与对函数的普通调用不同,后者编译得很好。
try {
call_a_function();
}
catch (const char* msg) {
//...
}
我在这里错过了什么? 此代码使用的是 Visual Studio 2012,如果这很重要的话......
最佳答案
它的实际用途极其可疑,但在功能上,lambda 的 []
捕获可防止(编译错误)意外使用函数本地“call_a_function”。例如,前面的 auto call_a_function = [] { ... };
会触发“未捕获”错误,而简单的函数调用会使用该本地定义执行调用。
您提到“对函数的一些调用”——如果其他函数有参数,这就变得更相关了,因为捕获列表可能用于复制参数而不是给被调用函数潜在的非常量引用访问函数的局部变量。可能是为了风格上的一致性,甚至这个无参数调用也采用了 lambda 风格。
否则,Till 的评论会尽善尽美 - 例如它可能是某个特定的编译器内联或未内联 lambda,这对原始开发人员来说很重要 - 虽然破解它是一种可怕的方式。
关于c++ - 如果立即调用,为什么要将调用包含在 lambda 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20318772/