C++11/14學習(八)Lambda表達式

来源:https://www.cnblogs.com/ferrisyu/archive/2018/01/16/8299061.html
-Advertisement-
Play Games

Lambda 表達式是 C++11 中最重要的新特性之一。類似匿名函數,當需要一個函數但是又不想費力去命名時使用。這樣的場景其實有很多,所以匿名函數幾乎是現代編程語言的標配。 Lambda 表達式基礎 Lambda 表達式的基本語法如下: [捕獲列表](參數列表) mutable(可選)異常屬性 -... ...


Lambda 表達式是 C++11 中最重要的新特性之一。類似匿名函數,當需要一個函數但是又不想費力去命名時使用。
這樣的場景其實有很多,所以匿名函數幾乎是現代編程語言的標配。

Lambda 表達式基礎

Lambda 表達式的基本語法如下:

[捕獲列表](參數列表) mutable(可選)異常屬性 -> 返回類型 {
    // 函數體
}

捕獲列表,可以理解為參數的一種類型。
lambda 表達式內部函數體在預設情況下是不能夠使用函數體外部的變數的,這時候捕獲列表可以起到傳遞外部數據的作用。
根據傳遞的行為,捕獲列表也分為以下幾種:

1. 值捕獲

值捕獲的前提是變數可以拷貝,被捕獲的變數在 lambda 表達式被創建時拷貝,而非調用時才拷貝:

void learn_lambda_func_1() {
    int value_1 = 1;
    auto copy_value_1 = [value_1] {
        return value_1;
    };
    value_1 = 100;
    auto stored_value_1 = copy_value_1();
    // 這時, stored_value_1 == 1, 而 value_1 == 100.
    // 因為 copy_value_1 在創建時就保存了一份 value_1 的拷貝
}

2. 引用捕獲

引用捕獲保存的是引用,值會發生變化:

void learn_lambda_func_2() {
    int value_2 = 1;
    auto copy_value_2 = [&value_2] {
        return value_2;
    };
    value_2 = 100;
    auto stored_value_2 = copy_value_2();
    // 這時, stored_value_2 == 100, value_1 == 100.
    // 因為 copy_value_2 保存的是引用
}

3. 隱式捕獲

手動書寫捕獲列表有時候是非常複雜的,這種機械性的工作可以交給編譯器來處理。
可以在捕獲列表中寫一個 & 或 = 向編譯器聲明採用 引用捕獲或者值捕獲。
捕獲列表的最常用的四種形式可以是:
[] 空捕獲列表
[name1, name2, ...] 捕獲一系列變數
[&] 引用捕獲, 讓編譯器自行推導捕獲列表
[=] 值捕獲, 讓編譯器執行推導應用列表

4. 表達式捕獲(C++14)

這部分內容需要瞭解後面馬上要提到的右值引用以及智能指針

上面提到的值捕獲、引用捕獲都是已經在外層作用域聲明的變數,因此這些捕獲方式捕獲的均為左值,而不能捕獲右值。
C++14允許捕獲的成員用任意的表達式進行初始化。
被聲明的捕獲變數類型會根據表達式進行判斷,判斷方式與使用auto 本質上是相同的:

#include <iostream>
#include <utility>
int main() {
    auto important = std::make_unique<int>(1);
    auto add = [v1 = 1, v2 = std::move(important)](int x, int y)
        -> int {
        return x + y + v1 + (*v2);
    };
    std::cout << add(3, 4) << std::endl;
    return 0;
}

在上面的代碼中, important 是一個獨占指針,是不能夠被捕獲到的,這時候我們需要將其轉移為右值,在表達式中初始化。

泛型 Lambda(C++14)

Lambda 表達式並不是普通函數,所以 Lambda 表達式並不能夠模板化。
這就為我們造成了一定程度上的麻煩:參數表不能夠泛化,必須明確參數表類型。
從 C++14 開始,Lambda 函數的形式參數可以使用 auto 關鍵字來產生意義上的泛型:

auto add = [](auto x, auto y) {
    return x + y;
};
add(1, 2);
add(1.1, 2.2);


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.開發環境 (推薦):jdk1.8+Maven(3.2+)+Intellij IDEA+windows10; 說明: jdk:springboot官方說的很明確,到目前版本的springboot(1.5.9),官方指定要求jdk1.8以上; 依賴包管理:可以通過拷貝jar文件的方式管理依賴,但官方 ...
  • [原創] 前幾天沒事幹看別人一直在玩微信上線的那一個跳一跳小游戲,玩著玩著老是掉下去,閑著沒事唄 就想了想做一個輔助程式的唄.不過先做的手動版的.自動版的有點麻煩.就不發了.用的Java寫的,也就一個蒙版. 下麵就開始介紹我的小程式,沒好多東西,真正的代碼應該就是100行左右,沒啥難的. 下麵這是我 ...
  • 首先,放上項目github地址:https://github.com/codethereforam/express mysql demo 一、前言 之前學的java,一直用的ssm框架寫後臺。前段時間接觸到node.js,於是花了兩天時間學了一下node.js並寫了一個CRUD簡單示例。由於前幾天一 ...
  • 終於有一點點小變化了,今天學習了java里的對話框,有四種類型:1、確認對話框(showConfirmDialog) 2、可選擇輸入的對話框(showInputDialog) 3、信息對話框(showMessageDialog) 4、可以對其他三種對話框組合的。(showOptionDialog) ...
  • http://blog.csdn.net/u011781521/article/details/70188171 http://wiki.jikexueyuan.com/project/scrapy/autothrottle.html coding: utf 8 Scrapy settings fo ...
  • a = [1,2,3,4,1,1,1,1] 刪除操作 刪除元素1 a.remove(1) 刪除第二個元素 del a[1] 預設刪除最後一個,給腳標就會刪除指定腳標元素 pop() 方法 a.pop() 搜索列表中的元素 a.index("sober") 統計元素出現次數 a.count(1) 添加 ...
  • 可以將二維數組理解為數組中的數組, 即一維數組裡在存一個一維數組 格式1:int[][] arr = new int[2][3]; arr的二維數組中有兩個一維數組,每個一維數組的大小是2。 arr[0]表示第一個一維數組,arr[0][0]表示第一個一維數組的第一個下標值。 格式2:int[][] ...
  • Eclipse導入web項目後,將web項目載入到server進行發佈時,提示Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web錯誤。 原因: 建立項目的時候會選擇所使用的J2EE版本,如果你選擇的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...