yohhoyの日記

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

コンセプト の検索結果:

std::destructibleコンセプト

C++

…uctible<T>コンセプトに関するメモ。ある型Tが「例外送出なしにデストラクト可能」と制約(constraint)するコンセプト。デストラクタは既定で暗黙のnothrow指定が行われるため*1、明示的にnothrow(false)指定を行わない限りあらゆるオブジェクト型が満たすコンセプトとなる。*2std::destructibleコンセプトは、標準ヘッダ <concepts> 提供のオブジェクト関連コンセプトにより直接/間接的に包摂(subsume)される。 std::…

std::views::splitとstd::views::lazy_split

C++

…ew。 入出力レンジコンセプト レンジアダプタの適用対象Vが満たすコンセプトに対して、適用結果の外部(Outer)レンジ/内部(Inner)レンジが満たすコンセプトは下表の通り。*5 入力\出力 splitOuter splitInner lazy_splitOuter lazy_splitInner input *6 (N/A) (N/A) input input forward forward forward forward forward bidirectional f…

MC Hammer in C++ Standard

…7e15c6bd34a std::ranges::constant_rangeコンセプトやstd::views::as_constレンジアダプタはC++2b(C++23)標準ライブラリへの追加予定機能。関連URL P2278R4 cbegin should always return a constant iterator James Bond in C++ Standard - yohhoyの日記 ジュラシック・パーク in C++ Standard - yohhoyの日記

std::generator<R>

…ratorはviewコンセプトとinput_rangeコンセプトのモデル。範囲for文や各種レンジアダプタ(range adaptor)と組み合わせて利用可能。 標準ヘッダ<ranges>の拡張 std::ranges::elements_of<R, Allocator>クラステンプレート(Rはrangeコンセプトのモデル、Allocatorは省略可) elements_ofはco_yield式に対するタグ型として機能する。 ジェネレータ利用側イテレータの提供型 Refere…

C++オブジェクト基本操作:Copyable/Movable/Swappable

C++

…+標準ライブラリ提供コンセプト定義における包摂関係(subsumption relation)としても表現されている(→id:yohhoy:20190903)。C++20 18.4.9/p4, 18.6/p1より一部引用。 template<class T> concept swappable = requires(T& a, T& b) { ranges::swap(a, b); }; // (snip) [Note: The semantics of the swappa…

コンセプト制約式の構成:包摂関係 vs. コンパイル時間

C++

C++20コンセプトでは制約式(constraint-expression)を&&(conjunction)/||(disjunction)で組み合わせることで複雑な制約式を表現できる。一方で制約式が多数の原始制約(atomic constraint)から構成されるケースでは、包摂関係(subsumption relation)判定のための正規化プロセスが複雑になりコンパイル時間に悪影響を及ぼす。例えばコンセプトX, Y, Zからなるコンセプトの定義方法として、下記2種類が考…

std::views::commonレンジアダプタの制約

…::copyableコンセプトを満たすことを要求するため。C++17互換イテレータではコピー可能・ムーブ可能を要求するが、C++20 Rangeを構成するイテレータはコピー不可・ムーブ可能であればよい。*2前掲コードのようにRange/Viewからコンテナへ変換したい場合、次期C++2b(C++23)標準ライブラリではstd::views::toレンジアダプタ(→id:yohhoy:20210902)が利用可能となる。 // C++2b(C++23) #include <ss…

コンセプト定義への属性指定

C++

…+20言語仕様では、コンセプト定義に対して属性(attribute)を指定できない。 2024-08-13追記:本件はCWG 2428でC++20 DRとして修正され、コンセプト(concept)に対するdeprecated属性指定が許可される。属性指定位置に注意。 // OK: CWG 2428適用後 template <typename T> concept C [[deprecated("concept")]] = /*...*/; template <typename…

クラステンプレート特殊化型判定

C++

…定するメタ関数およびコンセプト実装例。 // C++11/14/17: is_complexメタ関数 #include <complex> #include <type_traits> template <typename T> struct is_complex : std::false_type {}; template <typename T> struct is_complex<std::complex<T>> : std::true_type {}; static_…

可変長コンセプト×畳み込み式: The glass is half full or half empty?

C++

C++20コンセプトと論理演算子(&&, ||)による畳み込み式(fold expression)の関係について。本記事の内容はStackOverflowで見つけた質問と回答に基づく。まとめ:&&と||による畳み込み式を用いた制約式(constraint-expression)は機能するものの、コンセプト間の包摂関係(subsumption relation)は期待通りに成り立たない。2023-10-10追記:C++2cに向けた提案P2963R0にて、&&と||畳み込み式を用…

requires式中でのコンセプト制約表現には要注意

…ion) において、コンセプトや条件式を用いた制約(constraints)表現には注意が必要。 2022-05-08追記:gcc(g++) 12.1から警告 -Wmissing-requires が追加され、本記事で言及しているrequiresキーワード指定忘れの可能性を検知できる。本警告は既定で有効化される。*1下記コードのように式std::signed_integral<decltype(N)>やN == 42をrequires式中に単に記載すると単純要件(simple…

RangeとViewとconst修飾

C++

…stの時にrangeコンセプトを満たさないのは何故? - スタック・オーバーフロー filter_viewがconst-iterableではない理由 std::string_viewでは値渡しを利用する - yohhoyの日記 const, mutableキーワードとスレッド安全性 - yohhoyの日記 C++11標準ライブラリのスレッド安全性 - yohhoyの日記 *1:C++20 Rangesライブラリ仕様のベースとされた range-v3 ライブラリでは、要素に対し…

制約式std::bool_constant<cond>::value

C++

…_generatorコンセプトで同テクニックが利用される。C++20 26.6.2.3/p1より引用。 A uniform random bit generator g of type G is a function object returning unsigned integer values such that each value in the range of possible results has (ideally) equal probability of b…

std::is_convertible vs. std::convertible_to

C++

…ertible_toコンセプトの超微妙な違い。本記事の内容はStackOverflowで見つけた質問と回答に基づく。要約: is_convertible<From, To>メタ関数:From型からTo型へ暗黙変換できることを検査する。 convertible_to<From, To>コンセプト:From型からTo型へ暗黙変換および明示変換できることを検査する。 暗黙変換は可能だが明示変換が許可されないケースで差異が生じる。ジェネリックライブラリの設計者大変すぎでしょ。 #in…

非staticデータメンバを判定する制約式

C++

…バT::mを確認するコンセプト(?) template <typename T> concept HasStaticM = requires { { T::m } -> std::convertible_to<int>; }; // 式 T::m はmがstaticメンバのときのみ有効 assert( X::m == 1 ); // OK static_assert( HasStaticM<X> ); // OK // mが非staticメンバの場合は式 T::m と書けない…

requires制約とテンプレート特殊化の関係

C++

C++20コンセプトで導入されたrequires節と、テンプレート特殊化の組み合わせには注意が必要。例えば制約付きプライマリテンプレート(#1)に対してdouble型で明示的特殊化(#2)しようとしても、下記記述コードでは#2定義でill-formedになる。これは#1のrequires節によりT=doubleのときプライマリテンプレート不在とみなされるため。 #include <concepts> // #1 プライマリテンプレート(?) template<typename…

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

…+2a(C++20)コンセプトにおける原始制約(atomic constraint)では、パラメータ置換(parameter mapping)の失敗はハードエラー(ill-formed)を引き起こさず、その制約式を満たさない(not satisfied)と解釈される。C++17現在はstd::void_tやstd::conjunctionを駆使した難解なテンプレートメタプログラミング技法が要求されるが、C++2aでは単純な制約式記述によるコンセプト定義により代替される。はず。…

コンセプトと短絡評価

…+2a(C++20)コンセプトの制約式(constraint-expression)では、論理演算&&, ||は短絡評価される。*1C++17現在のテンプレートメタプログラミングではstd::conjunction, std::disjunctionメタ関数を必要とするが、C++2aコンセプト導入により自然な制約記述が可能となる。 T型が「std::atomic<T>が常にロックフリー(lock free)か否か」を判定するメタ関数は、std::conjunctionメタ関数…

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

…+2a(C++20)コンセプト requires式(requires-expression) に記述する 複合要件(compound-requirement) では「ある式の評価結果が特定コンセプトを満たすこと」を制約するが、このとき標準コンセプトstd::same_as/std::convertible_toを適切に使い分ける必要がある。特に “データメンバ型の制約” には注意すること。下記コードのコンセプトC0では式t.dataがint型へと変換可能(convertibl…

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

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

requires式から利用可能な宣言

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

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

…t_iteratorコンセプト(concept) の変遷についてメモ。まとめ: C++2a(C++20) input_iteratorコンセプトではイテレータ型にoperator*オーバーロードのみ要求する。operator->オーバーロードは要求されない。 C++17以前の InputIterator 要件では、イテレータ型に対してoperator*とoperator->オーバーロードの両方を要求する。 N4835(C++2a WD) Cpp17InputIterator要…

same_asコンセプトとSymmetric Subsumption Idiom

…ライブラリ提供の標準コンセプトstd::same_as、およびコンセプト定義における対称包摂イディオム(Symmetric Subsumption Idiom)についてメモ。制約式std::same_as<X, Y>と制約式std::same_as<Y, X>は対称関係、つまり互いに一方が他方を包摂する(subsume)関係にある。これによりコンセプトへのテンプレートパラメータ指定順が一致していなくとも、制約式を用いた関数オーバーロード解決の半順序関係を表現できる。 // C…

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

…+20)で導入されるコンセプト(concept)に関して、制約式(constraint-expression)間の包摂(subsume)ルールに基づくオーバーロード解決のメモ。本記事の内容はStackOverflowで見つけた質問と回答に基づく。要約:制約式の包摂関係(subsumption relation)判定では、制約を構成するトークン列が同じというだけではダメで、C++ソースコード上での記述位置(=構文木におけるノード)の同一性が考慮される。こんなん分かる気がしない_…

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

…ブラリに導入される コンセプト(concept) の名前付けガイドラインについて。2019年Cologne会合にて (PDF)P1754R1 が採択され、Ranges TS提案当初から PascalCase 形式で検討されていた命名規則から snake_case 形式へと変更された。これにより従来C++標準ライブラリとの一貫性は向上したが、その名前のみからはコンセプトなのかクラスやメタ関数*1なのかを判別しづらくなっている。*2提案文書P1851R0では、P1754R1から改…

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

…れること」を要求するコンセプトHasConstantSizeの定義例。requires式(requires-expression)中の typename type-name; 構文(type-requirement)は、type-name が有効な型であることを表明する。例示コードのように、クラステンプレート特殊化に対しては完全型が要求されない。*1 // C++2a template<auto> struct require_constant; template<class…

Customization Point Object

…ジェクト。 最初に「コンセプトによる型制約を検査」してから「ADLによって適切な関数オーバーロードを検索」するための仕組み。 C++17現在の関数オーバーロード方式では、[A]誤って利用されるリスクが高く、[B]コンセプトを用いた型制約を強制できない という問題がある。 CPO呼び出しの引数型は、CPOが要求するコンセプトを満たす。引数型リストがコンセプトを満たさない場合は、オーバーロード解決候補から除外される。 CPO呼び出しの戻り値型は、CPOに対して定めたコンセプトを満…

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

…に向けて採択された、コンセプト(concept)関連の短縮構文についてメモ。C++コンセプト概略ついては id:yohhoy:20170904 を参照のこと。本記事の内容は P1141R2 Yet another approach for constrained declarations に基づく。要約: autoキーワードによる関数テンプレート定義が可能。“template-less Function Template” 現行autoキーワードを用いた型推論にて、コンセプト…

C++ Concepts(P0734R0)

…に向けて採択された コンセプト(concept) についてメモ。*1本記事の内容は(PDF)P0734R0 Wording Paper, C++ extensions for Conceptsに基づく。要約: 新しいキーワード:concept, requires 新しい構文:コンセプト定義, requires式, requires節 コンセプト(concept) == テンプレートパラメータに対する制約(constraint) コンセプト(concept) != 型(type…

関数パラメータ型としてのauto?

…関数テンプレートへのコンセプト制約指定が主目的だが、同構文の自然な拡張(コンセプト制約の省略形)として導入される。id:yohhoy:20190111 参照。2017-09-02追記:発行済み ISO/IEC TS 19217:2015(Concepts TS) には同仕様が含まれるが、C++2aに向けたP0696R0にて abbreviated function template はConcepts仕様から削除された。C++2aでは(PDF)P0734R0を統合予定となって…