我在 C++ 中读到了这样的代码:
const auto candidate_path = std::invoke([&]() {
if (status == ModuleStatus::SUCCESS || status == ModuleStatus::FAILURE) {
// clear candidate path if the module is finished
return convertToPath(nullptr, false, planner_data);
}
return convertToPath(
observer.lock()->getPathCandidate(), observer.lock()->isExecutionReady(), planner_data);
});
代码创建一个匿名函数并通过引用捕获所有内容
[&](){}
,然后由std::invoke()
调用它,我想看看这样做有什么好处吗?
谢谢。
变量
candidate_path
旨在具有 const
限定。立即调用的 lambda 允许使用(多个)语句来初始化变量,而不仅仅是 =
之后的单个表达式,而不会牺牲 const
。
在这种特定情况下,它也可以在单个表达式中使用三元运算符,但这可能更难以阅读。
之所以使用
std::invoke
来调用 lambda 而不是编写 [&](){ /*...*/ }()
可能是作者的个人偏好。我认为可能的原因是更容易识别 lambda 正在被调用。使用直接语法,人们很容易错过末尾的 ()
。