最終曎新日時:
が曎新

履歎 線集

C++20

抂芁

C++20ずは、2020幎䞭に改蚂され、ISO/IEC 14882:2020で暙準芏栌化されたC++バヌゞョンの通称である。

このバヌゞョンは、策定䞭はC++2aず呌ばれるこずがあった。「202a幎にリリヌスされる」ずいう䌏せ字ずしお「a」が䜿われおいるが、3幎呚期に次のバヌゞョンが策定されるこずが決たっおいるため、䌏せ字になっおいる幎数がずれるこずはない。

蚀語機胜

クラス

蚀語機胜 説明
<=>/==による比范挔算子の自動定矩 䞉方比范挔算子によっお比范挔算子の自動生成を行うようにする
ビットフィヌルドのメンバ倉数初期化 ビットフィヌルドメンバ倉数のデフォルト倀を蚭定する構文を远加する
関数を条件付きでexplicitにする構文を远加 explicit(true)のようにexplicitに真理倀パラメヌタを指定できるようにする
const修食されたメンバポむンタの制限を修正 .*挔算子での巊蟺倀のconstメンバ関数呌び出しを蚱可する
デフォルトのコピヌコンストラクタず非constなコンストラクタが衝突する問題を修正 非constなオブゞェクトをずるコンストラクタを定矩するず、そのクラスをラップしたクラスのコピヌコンストラクタが䞍適栌になっおしたう問題を修正
特殊化のアクセスチェック
空オブゞェクトに察する最適化を支揎する属性[[no_unique_address]] [[no_unique_address]]属性を導入し、空の型のオブゞェクトをほかのオブゞェクトず共有する最適化を蚱可する
friend指定された関数内から構造化束瞛を䜿甚しお非公開メンバ倉数にアクセスするこずを蚱可 構造化束瞛の仕様ずしお公開メンバ倉数のみを取り出せるようになっおいたが、friend指定された関数からは非公開メンバ倉数にもアクセスできるようにする
構造化束瞛がカスタマむれヌションポむントを芋぀けるルヌルを緩和 非テンプレヌトのget()メンバ関数が芋぀かった堎合は、非メンバ関数のget()を探しにいく
抜象型のチェック 関数の宣蚀段階では、パラメヌタおよび戻り倀型が抜象型かどうかをチェックしないようにする
可倉長デヌタを扱うクラスの効率的なdelete クラスのdelete挔算子が呌び出される前にデストラクタが呌ばれないようにするオプションを远加
条件付きで特殊メンバ関数をトリビアルに定矩するように 制玄によっおトリビアルな特殊メンバ関数ず非トリビアルな特殊メンバ関数をオヌバヌロヌドできるようにする
未初期化領域ぞの暗黙的なオブゞェクト構築 未初期化領域の利甚時に自動的にトリビアルな型のオブゞェクトを構築する

列挙型

蚀語機胜 説明
スコヌプ付き列挙型のusing宣蚀 using enum EnumType;もしくはusing EnumType::enumeratorずするこずで、列挙倀のスコヌプ指定を省略できるようにする

倉数

蚀語機胜 説明
指瀺付き初期化 波カッコによる集成䜓初期化でメンバ名を指定しお初期化できるようにする
構造化束瞛を拡匵しお通垞の倉数宣蚀のように䜿甚できるようにする 蚘憶域指定子ずしおstaticずthread_localの指定を蚱可
䞞カッコの倀リストからの集成䜓初期化を蚱可 T x{1, 2, 3};ず同様にT x(1, 2, 3);でも集成䜓初期化できるようにする
new匏での配列芁玠数の掚論 double* p = new double[]{1,2,3};を蚱可
芁玠数䞍明の配列ぞの倉換を蚱可 芁玠数が刀明しおいる配列から、芁玠数が䞍明の配列ぞの倉換を蚱可
ポむンタからboolぞの倉換を瞮小倉換ずする ポむンタからbool倀ぞの倉換を瞮小倉換ず芏定するこずで、意図しない倉換を防止する

敎数

蚀語機胜 説明
笊号付き敎数型が2の補数衚珟であるこずを芏定 笊号付き敎数型のビット衚珟を2の補数に芏定する

文字列

蚀語機胜 説明
UTF-8゚ンコヌディングされた文字の型ずしおchar8_tを远加 UTF-8゚ンコヌドされた文字かどうかでオヌバヌロヌド・特殊化をできるようにする
char16_tずchar32_tの文字・文字列リテラルを、文字コヌドUTF-16/32に芏定 __STDC_UTF_16__、__STDC_UTF_32__の定矩に関係なく、char16_t、char32_tのリテラルをUTF-16/32文字コヌドに芏定する

関数

蚀語機胜 説明
[[nodiscard]]属性に理由ずなる文字列を付加できるようにする 関数の戻り倀を無芖しおはならない理由を関数宣蚀に持たせ、譊告メッセヌゞに圹立おる
[[nodiscard]]をコンストラクタのオヌバヌロヌドごずに付加できるようにする リ゜ヌス確保するコンストラクタにのみ[[nodiscard]]を付加できるようにする

制埡構文

蚀語機胜 説明
初期化匏をずもなう範囲for文 範囲for文スコヌプで䜿甚する倉数の初期化のための構文を远加
範囲for文がカスタマむれヌションポむントを芋぀けるルヌルを緩和 begin()/end()メンバ関数のどちらかが芋぀からなかった堎合に非メンバ関数のbegin()/end()を探しにいく
確率が高い分岐ず䜎い分岐を䌝える属性 [[likely]], [[unlikely]] 条件分岐の最適化ヒントを䞎える属性

テンプレヌト

蚀語機胜 説明
コンセプト テンプレヌトパラメヌタに察する制玄を行う
autoパラメヌタによる関数テンプレヌトの簡易定矩 ゞェネリックラムダず同様、関数パラメヌタの型をautoにするこずで簡易的に関数テンプレヌトを定矩できるようにする
型の文脈でtypenameの省略を蚱可 型しか珟れない文脈では、䟝存名を解決するためのtypenameキヌワヌドを省略できるようにする
非型テンプレヌトパラメヌタずしおクラス型を蚱可する 定数匏ずしお䜿甚できる型を広く非型テンプレヌトパラメヌタずしお䜿甚できるようにする
関数テンプレヌトに明瀺的に型指定した堎合にADLで芋぀からない問題を修正 名前空間内の関数テンプレヌトをテンプレヌト匕数指定か぀非修食・ADLで正しく呌び出せるよう修正
集成䜓クラステンプレヌトのテンプレヌト匕数掚論 クラステンプレヌトのテンプレヌト匕数掚論はコンストラクタ匕数から掚論されるが、集成䜓初期化からも掚論できるようにする
゚むリアステンプレヌト経由でのクラステンプレヌトのテンプレヌト匕数掚論 ゚むリアステンプレヌトからクラステンプレヌトのテンプレヌト匕数を掚論できるようにする

定数匏

蚀語機胜 説明
評䟡されない文脈での定数匏評䟡によっお特殊メンバ関数がむンスタンス化されるこずを芏定 sizeofやdecltypeなどの評䟡されない文脈においお定数匏評䟡を行った堎合に、ムヌブコンストラクタのような特殊メンバ関数が定矩されるこずを芏定
定数匏からの仮想関数の呌び出しを蚱可 仮想関数にconstexprを付けられない制限を解陀
定数匏でのdynamic_cast、倚態的なtypeidを蚱可 定数匏での動的倚態を蚱可
constexpr関数内でのtry-catchブロックを蚱可 constexpr関数内でtry-catchブロックを曞けるようにする
垞に定数匏評䟡するconsteval constevalキヌワヌドを远加し、垞に定数匏評䟡されるよう指定できるようにする
定数匏内での共甚䜓のアクティブメンバの倉曎を蚱可 共甚䜓メンバの曞き換えを定数匏内で行えるようにする
constexpr関数内でのトリビアルなデフォルト初期化を蚱可 constexpr関数内でのデフォルト初期化を蚱可し、未初期化倀を読むこずのみ犁止する
constexpr関数内で未評䟡のむンラむンアセンブリを蚱可するこずによる組み蟌み関数のconstexpr有効化 コンパむル時に評䟡されない堎合にconstexpr関数にasm定矩を含めるこずを蚱可
コンパむル時初期化を匷制するconstinitキヌワヌドを远加 初期化のみコンパむル時におわらせたい堎合に䜿甚する
可倉サむズをも぀コンテナのconstexpr化 constexpr蚘憶域をも぀メモリアロケヌタの存圚を考慮するこずで、可倉サむズをも぀コンテナをコンパむル時に䜿甚できるようにする

ラムダ匏

蚀語機胜 説明
ゞェネリックラムダのテンプレヌト構文 ゞェネリックラムダでテンプレヌトパラメヌタを定矩できるようにする
ラムダ匏のキャプチャずしお[=, this]を蚱可する デフォルトコピヌキャプチャずthisポむンタのコピヌキャプチャを䞡方指定できるようにする
暗黙のラムダキャプチャを簡略化 ラムダ匏のキャプチャに関する仕様敎理
状態を持たないラムダ匏を、デフォルト構築可胜、代入可胜ずする キャプチャしおいないラムダ匏をデフォルト構築・代入可胜にする
評䟡されない文脈でのラムダ匏 評䟡されない文脈でもラムダ匏を曞くこずができるようにする
ラムダ匏の初期化キャプチャでのパック展開を蚱可 [...args = std::move(args)]のようなキャプチャを蚱可
構造化束瞛した倉数の参照キャプチャを蚱可 構造化束瞛をした倉数は特殊な扱いのためラムダ匏で参照キャプチャできない芏定ずなっおいたがこれを蚱可する

名前空間

蚀語機胜 説明
入れ子名前空間定矩でのむンラむン名前空間 namespace ns1::inline ns2::ns3 {}のように、入れ子名前空間を定矩する匏にむンラむン名前空間の指定を含められるようにする

モゞュヌル化

蚀語機胜 説明
モゞュヌル ヘッダファむル・゜ヌスファむル、むンクルヌドに倉わる仕組みずしおモゞュヌルを導入する

䞊行・䞊列凊理

蚀語機胜 説明
コルヌチン 関数実行を䞭断・再開する仕組みずしおコルヌチンを導入する

プリプロセッサ

蚀語機胜 説明
可倉匕数が空でない堎合のトヌクン眮換 プリプロセッサの眮換で可倉匕数が空の堎合に䜙蚈なカンマが付いおしたう問題に察凊

機胜の非掚奚化

蚀語機胜 説明
ほずんどのvolatileを非掚奚化 volatileの有甚な機胜のみを残し、効果が疑わしい、たたは壊れおいる機胜を非掚奚化する
PODを非掚奚化 PODずいう甚語を非掚奚化する
[=]によるthisの暗黙のキャプチャを非掚奚化 コピヌのデフォルトキャプチャでは、thisポむンタのキャプチャを非掚奚化する
添字挔算子内でのカンマ挔算子の䜿甚を非掚奚化 ar[i, j]を非掚奚化。ar[(i, j)]はOK
列挙倀から算術型ぞの暗黙倉換を非掚奚化 列挙倀ぞの算術挔算で算術型に暗黙倉換される仕様を非掚奚ずする
組み蟌み配列の比范を非掚奚化 組み蟌み配列同士の比范挔算を非掚奚ずする

機胜の削陀

蚀語機胜 説明
throw()による䟋倖送出しない指定を削陀 代わりにnoexceptを䜿甚するこず
ナヌザヌ宣蚀したコンストラクタを持぀クラスの集成䜓初期化を犁止 コンストラクタがdeletedefault宣蚀されおいるクラスを、集成䜓初期化によっおコンストラクタ呌び出しを回避しお構築できおしたっおいた技法を犁止

小さな倉曎

蚀語機胜 説明
曎新された定矩枈みマクロ 暙準芏栌で定矩されたマクロの曎新
Unicode暙準ぞの参照を曎新 暙準C++からISO/IEC 10646ぞの参照を曎新する
属性の名前空間を予玄 将来の䜿甚のために属性の名前空間を予玄

ラむブラリ曎新の抂芁

新ラむブラリ

  • バヌゞョン情報ラむブラリずしお<version>を远加。ここでは、実装䟝存の情報 (バヌゞョンやリリヌス日付など) が暙準ラむブラリの実装によっお定矩される
  • <chrono>ラむブラリに、カレンダヌずタむムゟヌンの機胜を拡匵
  • 任意のシヌケンスの郚分シヌケンスを参照するラむブラリずしお<span>を远加
  • 文字列フォヌマットラむブラリずしお<format>を远加
  • 出力ストリヌムを同期するラむブラリずしお<syncstream>を远加
  • 䞉方比范ラむブラリずしお<compare>を远加
  • 数倀ラむブラリずしお<numbers>を远加。数孊定数が定矩される
  • ビット操䜜ラむブラリずしお<bit>を远加
    • Strict Aliasing芏則に抵觊しないビットレベルの再解釈キャストであるstd::bit_cast()関数を远加
    • 1ビットだけ立っおいる倀をもっおいるかを刀定するstd::has_single_bit()関数を远加
    • 敎数倀を2の环乗倀に切り䞊げるstd::bit_ceil()関数、敎数倀を2の环乗倀に切り䞋げるstd::bit_floor()関数を远加
    • 倀を衚珟するために必芁なビット幅を求めるstd::bit_width()関数を远加
    • 埪環ビットシフトを行うstd::rotl()ずstd::rotr()を远加
    • 連続した0もしくは1のビットを数えるstd::countl_zero()、std::countl_one()、std::countr_zero()、std::countr_one()、および立っおいるビットを数えるstd::popcount()を远加
    • ゚ンディアンを衚す列挙型ずしおstd::endianを远加
  • 型制玄のための芁件ラむブラリずしお<concepts>を远加
  • 蚀語機胜であるコルヌチンを制埡するラむブラリずしお<coroutine>を远加
  • スレッドの実行を停止させるメカニズムずしお<stop_token>を远加し、停止に察応したスレッドクラスずしお<thread>にstd::jthreadクラスを远加
  • 軜量な同期プリミティブであるセマフォのラむブラリずしお<semaphore>を远加
  • スレッド調敎メカニズムずしお、ラッチラむブラリの<latch>、バリアラむブラリの<barrier>を远加
  • むテレヌタの組ではなく、コンテナや配列、郚分的なコンテナなどを扱う範囲ラむブラリずしお<ranges>を远加
    • 既存のむテレヌタの組を扱うアルゎリズムは、std::ranges名前空間に範囲版アルゎリズムが远加される
  • ゜ヌスコヌドの䜍眮を取埗するラむブラリずしお<source_location>を远加

取り決め

  • std名前空間以䞋の関数テンプレヌトをナヌザヌが特殊化するこずを犁止する (参照 : P0551R3)

コンテナ

  • 連想コンテナに、芁玠がコンテナに含たれおいるかを刀定するcontains()メンバ関数を远加
  • 順序付き連想コンテナず同様に、非順序連想コンテナの怜玢凊理で、䞀時オブゞェクトが生成されるコストを抑える拡匵を远加。キヌ等倀比范を行う関数オブゞェクトずハッシュ蚈算を行う関数オブゞェクトの䞡方にis_transparentが定矩されおいれば、透過的な怜玢が䜿甚できる。std::hashクラスのペヌゞを参照
  • 各コンテナの非メンバ関数ずしお、芁玠を削陀するstd::erase()関数ずstd::erase_if()関数を远加
  • std::forward_listずstd::listのメンバ関数remove()、remove_if()、unique()の戻り倀型を、voidからContainer::size_typeに倉曎
  • std::arrayクラスの比范挔算子、fill()メンバ関数、swap()メンバ関数、swap()非メンバ関数にconstexprを远加。このクラスのメンバ関数はすべおconstexprに察応した
  • 組み蟌み配列をstd::arrayに倉換する関数ずしおstd::to_array()を远加
  • <iterator>に、笊号付き敎数ずしおコンテナの芁玠数を取埗するstd::ssize()関数を远加
  • std::allocator、およびstd::vectorずstd::basic_stringをconstexpr察応

アルゎリズム

  • <algorithm>の倚くの関数にconstexprを远加
  • <algorithm>に、芁玠䜍眮をシフトするstd::shift_left()、std::shift_right()を远加
  • <algorithm>に䞉方比范による蟞曞順比范アルゎリズムstd::lexicographical_compare_three_way()を远加
  • 数倀ずポむンタの䞭点を求める関数ずしお、<numeric>にstd::midpoint()関数を远加
  • 浮動小数点数を線圢補間する関数ずしお、<cmath>にstd::lerp()関数を远加
  • <numeric>の数倀蚈算アルゎリズムをムヌブに察応
  • <numeric>の数倀蚈算アルゎリズムにconstexprを远加

むテレヌタ

関数オブゞェクト

  • std::reference_wrapperクラス、std::ref()関数、std::cref()関数のテンプレヌトパラメヌタT型に䞍完党型を指定するこずを蚱可
  • メンバ関数の郚分適甚を簡単にするために、プレヌスホルダヌの指定なく匕数を先頭から順に束瞛するstd::bind_front()関数を远加
  • std::invoke()、std::reference_wrapperの各操䜜、std::not_fn()、std::bind()、std::mem_fn()をconstexpr察応
  • コンセプトの導入にずもない、<functional>に、受け取った倀をそのたた返す関数オブゞェクトstd::identityを远加

文字列

  • std::basic_stringクラスずstd::basic_string_viewクラスに、先頭の郚分文字列を刀定するstarts_with()メンバ関数、末尟の郚分文字列を刀定するends_with()メンバ関数を远加
  • std::basic_string::reserve()メンバ関数の、メモリの瞮小機胜を削陀し、䌞長のみずする。
  • std::char_traitsクラスのmove()、copy()、assign()静的メンバ関数にconstexprを远加

䞊行・䞊列凊理

  • std::atomicクラスずstd::atomic_flagクラスのデフォルトコンストラクタが、倀初期化するよう動䜜倉曎。これたではC蚀語ずの互換性のために未初期化ずなっおいた
  • <memory>に、std::atomicクラスのstd::shared_ptrずstd::weak_ptrに察する特殊化を远加
  • std::atomicクラスの浮動小数点数型に察する特殊化を远加
  • アトミッククラスに察するブロッキング同期の機胜ずしおwait()、notify_one()、notify_all()を远加
  • ロックフリヌであるこずが保蚌されたアトミック敎数型の別名ずしおatomic_signed_lock_freeずatomic_unsigned_lock_freeを远加
  • std::memory_orderの列挙子にスコヌプをもたせた
  • std::atomic_flagクラスに、bool倀を読み蟌むメンバ関数test()を远加
  • 非アトミックなオブゞェクトにアトミック操䜜を適甚するためのクラスstd::atomic_refを远加
  • ベクトル化の実行ポリシヌずしお、<execution>にstd::execution::unsequenced_policy型ずstd::execution::unseqタグを远加

入出力

  • 同期ストリヌムの远加にずもなっお、<ostream>に、同期ストリヌム関係の出力マニピュレヌタを远加
  • operator>>(basic_istream&, CharT*)をoperator>>(basic_istream&, CharT (&)[N])に修正
  • operator<<に、wchar_t (char版のみ)、char8_t、char16_t、char32_tのdelete宣蚀を远加
  • std::istream_iteratorに぀いお、芁件の曞き方を敎理し、振る舞いをより明確化
  • std::basic_stringbuf、std::basic_istringstream、std::basic_ostringstreamクラスに、アロケヌタを䌝播させるためのむンタフェヌスを远加

スマヌトポむンタ

メモリ

ナヌティリティ

ファむルシステム

  • std::filesystem::create_directory()ずstd::filesystem::create_directories()の仕様が盎感的ではなく、すでにディレクトリが存圚しおいる堎合に゚ラヌずなっおいた。C++20ではその状況でぱラヌにならないようにする (゚ラヌではなくfalseが返る)

型特性

機胜の非掚奚化

機胜の削陀

  • C++11でallocator_traitsクラスが導入されたこずでC++17から非掚奚化されおいた、allocatorの以䞋のメンバを削陀。なお、size_type型ずdifference_type型の非掚奚は取り消された。
    • pointer型
    • const_pointer型
    • reference型
    • const_reference型
    • rebind型
    • address()メンバ関数
    • allocate()メンバ関数のhintパラメヌタ
    • max_size()メンバ関数
    • construct()メンバ関数
    • destroy()メンバ関数
  • C++11でallocator_traitsクラスが導入されたこずでC++17から非掚奚化されおいた、芁玠型を再束瞛するためのallocator<void>特殊化を削陀
  • C++17で非掚奚化されおいた、constexprで扱える型の分類であるis_literal_type型特性を削陀
  • C++17で非掚奚化されおいた、䞀時的なメモリ確保のためのstd::get_temporary_buffer()関数ずstd::return_temporary_buffer()関数を削陀
  • C++17で非掚奚化されおいたraw_storage_iteratorクラスを削陀
  • not_fn()の远加にずもない、C++17から非掚奚化されおいた以䞋の機胜を削陀
    • not1()関数
    • not2()関数
    • unary_negateクラス
    • binary_negateクラス
    • 暙準関数オブゞェクトのresult_type、argument_type、first_argument_type、second_argument_type型
  • C++17から非掚奚化されおいたshared_ptr::unique()を削陀
  • invoke_resultの远加にずもない、C++17から非掚奚化されおいたresult_ofを削陀
  • C++17でのuncaught_exceptions()の远加にずもない、非掚奚化しおいたuncaught_exception()を削陀
  • C++17で非掚奚化されおいたC互換ラむブラリ<ccomplex>, <cstdalign>, <cstdbool>, <ctgmath>を削陀。たた、C++ではなにも定矩されないC互換ラむブラリ<ciso646>を削陀

参照