首頁 >後端開發 >C++ >如何明確捕捉 Lambda 函數中的變數來解決編譯錯誤?

如何明確捕捉 Lambda 函數中的變數來解決編譯錯誤?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-23 18:23:01815瀏覽

How to Explicitly Capture Variables in Lambda Functions to Resolve Compilation Errors?

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn