C++20 標準已核准

ISO C++ 語言標準化委員會 得到正式認可的 國際標準 ”C ++ 20」。 規範中提供的功能(個別情況除外) 支持的 在編譯器中 GCC, и Microsoft Visual C ++。 支援C++20的標準函式庫在專案內實現 促進.

在接下來的兩個月內,批准的規格將進入準備發布文件的階段,屆時將對拼字錯誤和錯字進行編輯更正工作。 14882 月初,最終文件將發送給 ISO,以正式名稱 ISO/IEC 2020:23 進行發布。 同時,委員會已經開始製定下一個 C++2 標準 (C++XNUMXb),並將在下一次虛擬會議上考慮可能的選擇。 創新.

主要的 產品特點 C ++ 20 (程式碼範例):

  • 新增了「概念」(模板擴充),可讓您定義一組模板參數要求,這些要求在編譯時限制可以接受為模板參數的參數集。 這些概念可用於避免在範本內使用的資料類型的屬性與輸入參數的資料類型屬性之間的邏輯不一致。

    範本
    概念 EqualityComparable = 需要(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • 公認 放大 用於使用可以代替頭檔使用的模組。 模組提供了一種基於定義元件邊界來組織原始程式碼的新方法,而無需透過「#include」包含頭檔。
  • 宏 __VA_OPT__ 用於根據變數參數中標記的存在來自適應擴展變數宏。
  • 支援“”運算符進行三向比較。
  • 支援位元域的預設元素初始值設定項。
  • 能夠 lambda 捕捉“*this”表達式。

    結構 int_value {
    詮釋 n = 0;
    自動 getter_fn() {
    //壞的:
    // 回傳 [=]() { 回傳 n; };

    // 好的:
    返回 [=, *this]() { 返回 n; };
    }
    };

  • 透過指標(指向成員的指標)呼叫元素,使用指向透過「const &」表達式定義的臨時物件的指標。
  • 文件中所述的帶有析構函數的刪除操作符 P0722R1.
  • 類別可以使用沒有類型的模板參數。

    結構體 foo {
    foo() = 預設值;
    constexpr foo(int) {}
    };

    範本
    自動 get_foo() {
    返回f;
    }

    get_foo(); // 使用隱式建構函數
    獲取富();

  • 帶有構造函數的非持久性 lambda 表達式。
  • 允許 lambda 表達式的模板語法(“auto f = [] (標準::向量v)”)。
  • 能夠在模板參數中使用字串文字。
  • 支援 C 風格初始化語法 - 預設初始化初始化清單中未明確列出的欄位。

    結構體A {
    整數 x;
    整數y;
    整數 z = 123;
    };

    A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2

  • 支援空資料結構成員。
  • 支援可能和不可能的屬性,以通知優化器觸發條件構造的機率(“[[likely]] if (random > 0) {“)。
  • 能夠在“for”迴圈中使用範圍初始化變數值

    for (auto v = std::vector{1, 2, 3}; auto& e : v) {

  • new(“new double[]{1,2,3}”)中自動計算陣列大小;
  • “[[no_unique_address]]”屬性,其中沒有資料的變數不佔用空間。
  • 原子指針(std::atomic > 和 std::atomic >)。
  • 能夠在條件表達式中呼叫虛函數。
  • 支援只能使用常數的立即函數。

    consteval int sqr(int n) {
    返回 n * n;
    }

    constexpr int r = sqr(100); // 好的
    整數x = 100;
    int r2 = sqr(x); // 錯誤:'x' 不能當常數

  • 可以將 constexpr 與虛函數一起使用(“constexpr virtual int f() const { return 2; }”)。
  • 在標準庫中:
    • 新增了對 UTF-8 字串的 char8_t 類型的支援。
    • 新增了頭檔位(位元操作)和版本。
    • 現在可以檢查字串的前綴和後綴(starts_with、ends_with)。
    • 新增了 std::remove_cvref、std::unwrap_reference、std::unwrap_decay_ref、std::is_nothrot_convertible 和 std::type_identity 特徵。
    • 新增了函數 std::midpoint、std::lerp、std::bind_front、std::source_location、std::visit、std::is_constant_evaluated 和 std::assume_aligned。
    • 在 std::make_shared 中加入了對數組的支援。
    • 新增了 std::to_array 函數以將類似數組的物件轉換為 std::array。
  • 更方便的枚舉語法:

    枚舉類別 rgba_color_channel { 紅、綠、藍、alpha };

    std::string_view to_string(rgba_color_channel my_channel) {
    切換(我的頻道){
    使用枚舉 rgba_color_channel;
    案例紅色:返回“紅色”;
    案例綠色:返回“綠色”;
    案例藍色:返回“藍色”;
    案例阿爾法:返回“阿爾法”;
    }
    }

  • 在索引中,由於未定義的行為,禁止使用操作“,”(“a[b,c]”)。 已不再支援大多數使用 volatile 關鍵字聲明的變數的操作,包括標準類型的「++」和「—」操作。
  • 減少了需要“typename”來指示類型存在的情況的數量。

來源: opennet.ru

添加評論