yohhoyの日記

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

2020-08-01から1ヶ月間の記事一覧

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

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

decltype(auto) as non-type template-parameter

C++

非型テンプレートのプレースホルダ型にはautoまたはdecltype(auto)いずれも利用できる。素直にautoを使うべき。本記事の内容はStackOverflowで見つけた質問と回答に基づく。 template <auto N> struct S { /*...*/ }; // または template <decltype(auto) N> struct S { /*...*/ }; S<4</decltype(auto)></auto>…

decltype(e)とdecltype((e))のキモチ

C++

プログラミング言語C++における decltype指定子(decltype-specifier) の振る舞いについてメモ。 int x = 42; // 括弧なしの変数名 x decltype( x ) y = x; // int 型 // 括弧付きの式 (x) decltype((x)) z = x; // int& 型 一見すると奇妙に思えるdecltype(e…

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>…