在 Lambda 函数中捕获变量
在函数调用中使用 lambda 表达式时,从封闭范围捕获变量至关重要。在这种情况下,无法隐式捕获变量可能会导致编译错误,例如臭名昭著的“错误 C3493:'变量'无法隐式捕获...'”
请考虑以下代码片段:
<code class="cpp">int flagId = _ChildToRemove->getId(); auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(), [](Flag& device) { return device.getId() == flagId; }); m_FinalFlagsVec.erase(new_end, m_FinalFlagsVec.end());</code>
此代码尝试使用 lambda 函数从 C 中的向量中删除元素。 lambda 将向量 m_FinalFlagsVec 中每个设备的 ID 字段与外部变量 flagId(要识别的设备的 ID)进行比较。
但是,编译器会引发上述错误,表明 flagId 变量未包含在 lambda 的捕获列表中。要解决此问题,我们必须显式指定要从封闭范围捕获哪些变量。
<code class="cpp">[flagId](Flag& device) { return device.getId() == flagId; }</code>
通过在捕获列表中包含 flagId,我们指示 lambda 将从封闭范围访问 flagId 变量,有几种可用的捕获模式:
按值: 变量被复制到 lambda 的闭包中,使其在 lambda 内不可变。
<code class="cpp">[flagId = std::as_const(flagId)](Flag& device) { // flagId is immutable within the lambda }</code>
按引用: 变量在 lambda 中直接引用,允许修改。
<code class="cpp">[&flagId](Flag& device) { // flagId can be modified within the lambda }</code>
通过可变引用: 与通过引用捕获类似,但允许 lambda 修改捕获的内容
<code class="cpp">[mutable flagId](Flag& device) { // flagId can be modified within the lambda }</code>
选择合适的捕获模式取决于 lambda 函数的具体要求。通过从封闭范围中显式捕获变量,开发人员可以有效地处理 lambda 表达式中的数据,确保他们的代码保持功能正常且无错误。
以上是如何明確捕捉 Lambda 函數中的變數來解決編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!