首頁 >後端開發 >C++ >如何在 C Lambda 表達式中按值捕獲並修改捕獲的變數?

如何在 C Lambda 表達式中按值捕獲並修改捕獲的變數?

Linda Hamilton
Linda Hamilton原創
2024-11-03 11:12:29656瀏覽

How to Capture by Value and Modify Captured Variables in C   Lambda Expressions?

C 0x 中的Lambda 捕獲和常數

在C 0x 中使用lambda 表達式時出現一個常見問題:

在C 0x 中使用lambda 表達式有一個常見問題:有辦法捕獲按值擷取變量,同時防止擷取的值變為const?

C 語言標準指定按值擷取變數的 lambda 表達式以 const 方式執行此操作。這意味著捕獲的值無法在 lambda 內部修改。但是,在某些情況下,可能需要按值捕獲變量,但仍會修改其值。

例如,考慮一個具有非常量operator()方法的函式庫函子,我們想要捕捉並呼叫 lambda。以下程式碼將無法編譯:
<code class="cpp">struct foo
{
  bool operator () ( const bool &amp; a )
  {
    return a;
  }
};

int main()
{
  foo afoo;

  auto bar = [=] () -> bool
    {
      afoo(true);
    };

  return 0;
}</code>

這裡的錯誤是由於周圍的 [=] 捕獲列表,lambda 表達式的 operator() 被聲明為 const。為了解決這個問題,我們可以使用 mutable 關鍵字。透過將mutable 加入lambda 捕獲列表,我們允許lambda 修改捕獲的變量,甚至是透過值捕獲的變量:
<code class="cpp">auto bar = [=] () mutable -> bool
    {
      afoo(true);
    };</code>

此修改使lambda 的operator() 不是const,允許我們調用非const -afoo 物件的const operator()。

因此,要在 lambda 表達式中按值捕獲並防止捕獲的值成為 const,請在捕獲列表中使用 mutable 關鍵字。這允許 lambda 修改捕獲的變數而不會導致編譯錯誤。

以上是如何在 C Lambda 表達式中按值捕獲並修改捕獲的變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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