yohhoyの日記

技術的メモをしていきたい日記

C++2a

コンセプトのパラメータ置換失敗はハードエラーではない

C++2a(C++20)コンセプトにおける原始制約(atomic constraint)では、パラメータ置換(parameter mapping)の失敗はハードエラー(ill-formed)を引き起こさず、その制約式を満たさない(not satisfied)と解釈される。C++17現在はstd::void_tやstd::conjunctionを駆…

コンセプトと短絡評価

C++2a(C++20)コンセプトの制約式(constraint-expression)では、論理演算&&, ||は短絡評価される。*1C++17現在のテンプレートメタプログラミングではstd::conjunction, std::disjunctionメタ関数を必要とするが、C++2aコンセプト導入により自然な制約記述が可…

std::views::splitで文字列分割

C++2a(C++20) Rangesライブラリstd::views::splitを利用した文字列分割処理。*1 2021-06-24追記:次期C++2b(C++23)標準ライブラリではよりシンプルな実装が可能となる。split2str関数は「char範囲を区切り文字delimで分割しstd::stringのViewへ変換するレン…

Concept-basedオーバーロードとSFINAE-unfriendlyメタ関数の落とし穴

C++2a(C++20)で導入されるrequires節を用いた関連制約(associated constraints)により従来SFINAE技法よりも関数テンプレートのオーバーロード制御が容易となるが、戻り値型にSFINAE-unfriendlyなメタ関数を用いるケースでは意図しないコンパイルエラーを引き…

memcmp関数 × 宇宙船演算子

C++2a(C++20)で導入される三方比較演算子(three-way comparison operator)<=>(通称:宇宙船演算子(spaceship operator))と、C言語時代の関数インタフェースでよくみられる三方比較結果 “負値/値0/正値” との組合せ利用について。新旧仕様の橋渡し。例え…

複合要件とsame_as/convertible_toコンセプト

C++2a(C++20)コンセプト requires式(requires-expression) に記述する 複合要件(compound-requirement) では「ある式の評価結果が特定コンセプトを満たすこと」を制約するが、このとき標準コンセプトstd::same_as/std::convertible_toを適切に使い分ける必…

C++コンセプトとド・モルガンの法則

C++2a(C++20)コンセプトでは制約式(constraint-expression)に論理積(&&)/論理和(||)/論理否定(!)を表現できるが、制約式を用いたオーバーロード解決では通常の論理演算で期待される ド・モルガンの法則(De Morgan's laws) は適用されない。*1超要約:否定…

リテラル0との比較のみ許容する型

リテラル0との比較のみ許容する型の作り方。そのような型として、C++2a(C++20)三方比較演算子<=>の戻り値型(partial_ordering/ weak_ordering/strong_ordering)がある。 // C++2a #include <cassert> #include <compare> int main() { std::strong_ordering r = (108 <=> 42); </compare></cassert>…

requires式から利用可能な宣言

C++2a(C++20) コンセプト requires式(requires-expression) では、同式を包含するコンテキストのあらゆる宣言を利用できる。下記コードのrequires式からは関数テンプレートの仮引数xを参照している。requires式の本体(requirement-body)は評価されず(unevalu…

ラムダ式のオーバーロード

プログラミング言語C++において、ラムダ式のオーバーロード(もどき)を実装する方法。 // C++17 template <typename... Ts> struct overloaded : Ts... { // 基底クラス(ラムダ式のクロージャクラス)が提供する // operator()群をoverloadedクラス自身から公開する using </typename...>…

yield式を使わないジェネレータ

C++2a(C++20)コルーチンにはジェネレータ実装を容易にするco_yield式が導入されるが、動作仕様的にはco_await式のシンタックスシュガーとなっている。 #include <coroutine> #include <iostream> #include <utility> #define MIMIC_CO_YIELD 1 #if MIMIC_CO_YIELD // yield式相当を表現する</utility></iostream></coroutine>…

C++20標準ライブラリ仕様:Constraints/Mandates/Preconditions

C++2a(C++20)標準ライブラリの関数仕様記述で用いられる Constraints/Mandates/Preconditions の違いについてメモ。 現行C++17標準ライブラリの Requires は廃止され、C++2aでは Constraints/Mandates/Preconditions に細分化される。 Mandates: 型や定…

イテレータに->演算子オーバーロードは必要?

C++標準ライブラリが定める InputIterator 要件(requirement) と input_iteratorコンセプト(concept) の変遷についてメモ。まとめ: C++2a(C++20) input_iteratorコンセプトではイテレータ型にoperator*オーバーロードのみ要求する。operator->オーバーロー…

same_asコンセプトとSymmetric Subsumption Idiom

C++2a(C++20)ライブラリ提供の標準コンセプトstd::same_as、およびコンセプト定義における対称包摂イディオム(Symmetric Subsumption Idiom)についてメモ。制約式std::same_as<X, Y>と制約式std::same_as<Y, X>は対称関係、つまり互いに一方が他方を包摂する(subsume)関</y,></x,>…

20分くらいでわかった気分になれるC++20コルーチン

20分くらいでわかった気分になれるC++20コルーチン本文こちら→C++ MIX #5に参加しました - yohhoyの日記(別館)スライド資料:https://www.slideshare.net/yohhoy/20c20 関連URL C++コルーチン拡張メモ(N4736) - yohhoyの日記 C++コルーチン拡張メモ - Qi…

コンセプト制約式の包摂関係とオーバーロード解決

C++2a(C++20)で導入されるコンセプト(concept)に関して、制約式(constraint-expression)間の包摂(subsume)ルールに基づくオーバーロード解決のメモ。本記事の内容はStackOverflowで見つけた質問と回答に基づく。要約:制約式の包摂関係(subsumption relation…

C++標準コンセプトの名前付けガイドライン

C++2a(C++20)標準ライブラリに導入される コンセプト(concept) の名前付けガイドラインについて。2019年Cologne会合にて (PDF)P1754R1 が採択され、Ranges TS提案当初から PascalCase 形式で検討されていた命名規則から snake_case 形式へと変更された。これ…

定数式を要求するコンセプト

C++2a(C++20) Conceptを利用した「ある式が定数式であること」を要求する制約式の定義。型パラメータTに対して「T::size()がコンパイル時に評価されること」を要求するコンセプトHasConstantSizeの定義例。requires式(requires-expression)中の typename typ…

Customization Point Object

C++2a(C++20)標準ライブラリに導入される Customization Point Object についてメモ。*1まとめ: Customization Point == ユーザ定義型に対して事前定義した動作カスタマイズ可能点。具体的な処理実装ソースコードから呼び出される名前。 2021-06-29追記:C+…

Goodbye "bit" in C++, (Partially)

C++2a(C++20)言語仕様の定義においては、用語 "bit" の利用はできるだけ回避される(完全に無くなる訳ではない)。これはC++2a言語仕様変更「符号付き整数型==2の補数表現を保証」の影響。提案文書 P1236R1 Alternative Wording for P0907R4 Signed Integers…

ラムダキャプチャ中での前置ellipsisと後置ellipsis

プログラミング言語C++において可変長引数テンプレートパラメータパックをラムダ式でキャプチャする際、そのキャプチャ方式によってellipsis(...)の前置/後置が異なることに注意。 template <typename... Ts> void func(Ts... xs) { // C++11以降: 簡易キャプチャ(simple-ca</typename...>…

C++ Conceptsの短縮構文(P1141R2)

次期C++2a(C++20)標準規格に向けて採択された、コンセプト(concept)関連の短縮構文についてメモ。C++コンセプト概略ついては id:yohhoy:20170904 を参照のこと。本記事の内容は P1141R2 Yet another approach for constrained declarations に基づく。要約:…

関数テンプレート特殊化とADLの小改善

C++2a(C++20)における特殊化された関数テンプレート呼び出しとADL(Argument Dependent Lookup)に関する小さな改善。C++17現在の言語仕様では、タプル要素アクセス関数はstd::get<N>のように完全修飾名で呼び出す、もしくはusing std::get;により名前getを現在の</n>…

新機能は属性 or 構文 or 関数?

プログラミング言語C++標準化プロセスにおける、新機能の対応方針についての考え方。2018年Jacksonville会合におけるEWG(Evolution Working Group)ガイダンス。 構文上はオブジェクト(object)が対象のように見えるとしても、値(value)に関する属性を導入すべ…

クラステンプレートの非テンプレートメンバ関数でSFINAE

クラステンプレートのテンプレートパラメータに基づき、非テンプレートなメンバ関数オーバーロードでSFINAEを実現する方法。 template<typename T, typename U> struct X { // テンプレートパラメータT, Uによるメンバ関数オーバーロード void mf(const T&) { ... } // A) void mf(co</typename>…

C++標準ライブラリへのnodiscard属性

C++標準ライブラリにおけるnodiscard属性の使われ方についてメモ。関数戻り値の誤った破棄を警告する目的でC++17言語仕様に導入された。標準ライブラリではC++2a(C++20)からの利用となる。2018年8月現在、下記関数がnodiscard属性付与対象となっている。 ope…

C++標準ライブラリのビット処理関数群

C++2a(C++20)標準ライブラリに追加される <bit> ヘッダについてメモ。2020-05-11追記:(PDF)P1956R1が採択され*1、関数名が大幅に変更(ispow2→has_single_bit/ceil2→bit_ceil/floor2→bit_floor/log2p1→bit_width)された。"2の冪乗(powers of two)" への言及</bit>…

条件付きexplicit指定子

C++2a(C++20)言語仕様では 条件付きexplicit指定子 が追加され、pairやtupleなどの型Tを値保持するクラステンプレートにおいて、型Tコンストラクタ実装時のexplicit性継承(→id:yohhoy:20150416)が容易になる。 // C++17仕様 template <typename T1, typename T2> struct pair { // no</typename>…

C++コルーチン拡張メモ(N4736)

プログラミング言語C++のコルーチン(Coroutines)拡張に関するメモ。2018年4月現在、C++2a(C++20)標準規格での正式採択に向けた検討が進んでいる。2019-08-09追記:2019年2月会合にてP0912R5が採択され、C++2aへのコルーチン導入が決定している。id:yohhoy:20…

C++標準ライブラリのタイムゾーン(Time Zone)

C++2a(C++20)標準ライブラリ <chrono> ヘッダに追加される タイムゾーン(Time Zone) サポートについてざっくりメモ。本記事では簡単のため名前空間std::chronoを省略する。カレンダー(Calendar)については C++標準ライブラリのカレンダー(Calendar) 参照。まとめ: </chrono>…