如果立即调用,为什么要将调用封装在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进行了内联或没有内联,这对原始开发人员来说很重要——这将是一种可怕的破解方式。

最新更新