c++ - 如果立即调用,为什么要将调用包含在 lambda 中?

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

我正在查看的一段代码将一些对 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/

相关文章:

sql-server - SSDT Refactor Rename 被 Schema Comparison 脚本生成忽略

c++ - Visual Studio 2008 编译模板时不关心基类是否存在?

C++ 继承 : does lack of virtual destructor lead to memory leak?

Android-NDK GCC/C++ 对于 std::string::find/std::getline(...) 似乎不稳定

c++ - 没有规则使目标 *.so

c - 解决方案在 merge visual studio 2012 后不允许调试/构建/清理

c++ - 单击按钮时在 QFrame 中绘制。

visual-studio-2012 - 无法在 VS 2008 中加载 VS 2012 工作区

c++ - 从 std::string 解析整数,但如果是 float 则失败

c++ - 为什么std::lock_guard在使用std::adopt_lock之后释放锁?