auto{x}與auto(x)---一位中國小伙為cppreference作出的貢獻

来源:https://www.cnblogs.com/ChebyshevTST/archive/2023/12/28/17933558.html
-Advertisement-
Play Games

C++作為一門靜態類型語言,是需要程式員聲明變數類型的。然而來到了C++11,auto的誕生使得變數聲明變得及為方便,尤其是對於比較長的模板類型,auto一定程度上為代碼編寫者減輕了負擔。到了C++23,突然來了個新特性:auto{x}/auto(x),這又是個什麼東西,它的motivation又是 ...


  C++作為一門靜態類型語言,是需要程式員聲明變數類型的。然而來到了C++11,auto的誕生使得變數聲明變得及為方便,尤其是對於比較長的模板類型,auto一定程度上為代碼編寫者減輕了負擔。到了C++23,突然來了個新特性:auto{x}/auto(x),這又是個什麼東西,它的motivation又是什麼?

 

  首先這是一個中國小伙為C++23作出的貢獻,他是一位在美國工作的engineering,這是他的主頁。

  

到底解決了什麼問題?

  來看看這個函數。

void my_erase(auto& x) {
    std::erase(x, x.front());
}

  假如我們傳入一個vector類型,vector初始化為{1, 2, 3, 1, 2, 3},然後通過調用std::erase,按照正常想法,函數執行完畢之後vector應該僅僅刪掉大小為1首元素。可是事實卻並非如此,通過代碼運行會發現容器剩下的元素是{2, 3, 1, 3},這裡面究竟發生了什麼。

_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
reference
front() _GLIBCXX_NOEXCEPT
{
 __glibcxx_requires_nonempty();
 return *begin();
}

  通過源碼查看,可以發現front()其實是引用類型,而std::erase本身又調用了std::__remove_if,這也不難讓人想出解決問題的辦法,也就是做一份拷貝。

void my_erase(auto& x) {
    auto tmp = x.front();
    std::erase(x, tmp);
}

  但是既然都來寫Cpp了,我們還可以追求點“潔癖”,我們很多時候並不希望有多餘的拷貝,這時候右值就派上了用場。

void my_erase(auto& x) {
    using T = std::decay_t<decltype(x.front())>;
    std::erase(x, T{x.front()});
}

  在進行”類型萃取“之後,我們就可以獲取到了容器第一個元素的原始類型,或者叫退化類型,即可以去掉cv限定符還有引用的類型(如果傳入的是數組,就會退化為指針)。

 

  但是到了C++23,在上面這種語境的情況下,auto{x}/auto(x)便可大展拳腳,沒再必要進行”類型萃取“。

void my_erase(auto& x) {
    std::erase(x, auto{x.front()});
}

 

最後

  在現代C++中,auto無疑是寵兒,從C++11到C++14,再到如今的C++23,它隨時在發展著,使我們的代碼變得更加的簡潔和高效。在上面這個例子當中,我們無需進行多餘的操作,就能大大地簡化代碼,或許將來它還能在更多場合發展出優勢。


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

-Advertisement-
Play Games
更多相關文章
  • svelte文件編譯為js後的結構 源代碼: <script lang="ts"> let firstName = '張' let lastName = '三' let age = 18 function handleChangeName() { firstName = '王' lastName = ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. 需求分析 為了提高用戶對頁面鏈接分享的體驗,需要對分享鏈接做一些處理。 以 Telegram(國外某一通訊軟體) 為例,當在 Telegram 上分享已做過處理的鏈接時,它會自動嘗試獲取鏈接的預覽信息,包括標題、描述和圖片。 如此當 ...
  • $0 和 __vue__ $0 是指當滑鼠點擊 Element 面板的某個 dom 元素後,console 里 $0 變數會自動指向該 dom 元素對象 __vue__ 是指 vue 框架會往 vue 組件 $mount 掛載的 dom 元素對象上添加一個 __vue__ 變數來指向當前 vue 組 ...
  • npm導入和風天氣的圖標庫後使用沒有效果,就在網上查詢了下怎麼解決,然後動手嘗試一下。 參考文章 步驟 1. 下載圖標文件(鏈接),解壓後大致這樣 2. 在transfonter網站將需要的圖標字體轉成Base64,在font\fonts文件下 選擇上傳 下載 3. 解壓後把stylesheet.c ...
  • keycloak~從login-status-iframe相關文章,可閱讀我的這兩篇keycloak~從login-status-iframe頁面總結如何跨域傳值 ,keycloak~對接login-status-iframe頁面判斷用戶狀態變更 。 什麼是跨域 跨域(Cross-Origin)是指 ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Python筆記一之excel的讀取 這裡我常用的 python 對於 excel 的讀取庫有兩個,一個是 xlsxwriter 用於操作 excel 的寫入,一個是 xlrd 用於 excel 文件的讀取。 使用的庫的版本如下: xlsx==1.2.6 ...
  • 第十九章介紹了Jasypt,用於在Spring Boot應用中加密敏感信息。通過jasypt-spring-boot-starter依賴項,配置加密演算法和密碼,並使用StringEncryptor加密和解密。加密後的信息可嵌入屬性文件中,提高資料庫密碼等敏感信息的安全性。加解密基於密鑰,建議將密鑰通... ...
  • 相較於BarCode,QRCode有明顯的特征區域,也就是左上角、右上角、左下角三個”回“字區域,得益於hierarchy中,父子關係的輪廓是連續的(下標),所以這個時候我們就可以通過cv2.findContours()返回的hierarchy來進行定位。 我們直接上代碼 1 import cv2 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...