C++20言語機能を利用した、ある式がコンパイル時に評価可能かを判定するメタ関数的なもの。id:yohhoy:20190528 の別解。本記事の内容はStackOverflowで見つけた質問と回答に基づく。 // C++20以降 template<class Lambda, int = (Lambda{}(), 0)> constexpr bool is_constexpr(Lambda) { return tr</class>…
プログラミング言語C++において、通常関数名やstaticメンバ関数名から関数ポインタ型へは暗黙変換が行われるが、メンバ関数名からメンバ関数ポインタ型への変換はアドレス演算子&利用が必須。 void f0(); struct S { static void f1(); void mf(); }; // (通…
C++20標準ライブラリstd::destructible<T>コンセプトに関するメモ。ある型Tが「例外送出なしにデストラクト可能」と制約(constraint)するコンセプト。デストラクタは規定で暗黙のnothrow指定が行われるため*1、明示的にnothrow(false)指定を行わない限りあらゆ</t>…
C++2b(C++23)標準ライブラリに追加されるstd::expected<T, E>の例外安全性についてメモ。正常型T/エラー型Eを値(value)として取り扱いつつ「強い例外安全性(Strong exception safety)」を満たすために、テンプレートパラメータに一定の制約が課される。 ムーブ/</t,>…
プログラミング言語Javaのtry-with-resources構文で用いるAutoClosableインタフェース仕様では、closeメソッドのべき等(idempotent)性は要求されない。(実装時には"べき等"が強く推奨される) void close() throws Exception Closes this resource, relinqu…
メンバ変数を1個ももたない空(empty)の構造体は、C++言語ではwell-definedとされるが、C言語ではill-formedとなる。 // C++: OK / C: NG struct S { }; GCCでは独自拡張として空の構造体を許容するが、標準C++とは異なり構造体サイズが0となることに注意。 /…
C++2b(C++23)標準ライブラリの多次元ビューstd::mdspanクラステンプレート(→id:yohhoy:20230303)は、第3テンプレートパラメータLayoutPolicyを介して任意のメモリレイアウトをサポートする。*1C++2b標準ライブラリは、多次元配列表現としてメジャーな行優…
C++2b(C++23)標準ライブラリの多次元ビューstd::mdspanクラステンプレート(→id:yohhoy:20230303)では、0次元(rank-0)ビューをサポートする。意味論上は “単一変数へのポインタ” に相当する。(´-`).。oO(使うことあるか?) // C++2b(C++23) #include <cassert> #i</cassert>…
C++2b(C++23)標準ライブラリに追加される多次元ビューstd::mdspanクラステンプレート(→id:yohhoy:20230303)の、コンストラクタと推論ガイド(deduction guide)による実引数クラステンプレート推論(CTAD; Class Template Argument Deduction)のあれこれ。mds…
C++2b(C++23)標準ライブラリに追加される多次元ビューstd::mdspanについて。multidimensional spanの略。 // <mdspan>ヘッダ namespace std { template< class ElementType, class Extents, class LayoutPolicy = layout_right, class AccessorPolicy = default_acce</mdspan>…
C++標準ライブラリのハッシュ計算ファンクタstd::hashを用いてヌル終端文字列のハッシュ計算を行う場合、ポインタ型に対するstd::hash<const char*>特殊化ではなくstd::hash<std::string_view>特殊化を用いる。*1下記コードにあるh0では、“文字列” からではなくアドレス値からハッシュ計算さ</std::string_view></const>…
プログラミング言語C++におけるconstexpr if文とstatic_assert宣言の組合せに関するメモ。2023年2月会合にてstatic_assert(false)を許容するP2593R1がCWG 2518へと統合され*1、C++言語仕様に対するDefect Reportとして遡及適用される。*2CWG 2518適用前のC++…
C++標準ライブラリの直和データ型std::variant<...>と組み合わせて空の状態を表すstd::monostateオブジェクトでは、std::hashによるハッシュ計算がサポートされる。*1各C++処理系で算出されるハッシュ値の一覧(括弧内は併記コメント/定数名): GCC: -7777…
C++ライブラリのクラステンプレート設計で見られる、型テンプレートパラメータへのvoidデフォルト指定に関するメモ。 template<class T = void> class SomeClass; C++2b(C++23)標準ライブラリ時点では、下記パターンでの用法が存在する。 デフォルトvoid型:std::enable_if(</class>…
プログラミング言語C++において、コンパイル時にある変数の宣言型を判定する方法あれこれ。 // 型名T と 変数名val // C++11以降 #include <type_traits> static_assert(std::is_same<T, decltype(val)>::value, ""); // C++17以降 #include <type_traits> static_assert(std::is_same_v<T, decltype(val)>); // C++20以降 #</t,></type_traits></t,></type_traits>…
POSIX Pthreadsライブラリのpthread_exit関数とメインスレッドとの関係について。本記事の内容はStackOverflowで見つけた質問と回答に基づく。まとめ: exit関数で終了:他のスレッドが実行中であってもプロセス終了する。 注:main関数からのreturnはexit関…
関数テンプレートの非型テンプレートパラメータ(non-type template parameter)において、通常のC++オーバーロード解決規則は適用されない。沼に近よるべからず ('ω'乂) template <bool N> void f() {} // #1 template <int N> void f() {} // #2 f<0>(); // NG: オーバーロ</int></bool>…
C++20標準ライブラリ提供レンジアダプタstd::views::splitとstd::views::lazy_splitの比較。*1まとめ: 入力レンジを区切りパターン(単一要素またはレンジ)を用いて分割し、「部分レンジ(subrange)のレンジ」へと変換するレンジアダプタ(range adaptor)。*…
Python3のEllipsisリテラル...の一風変わった使い方。擬似コード風のプレースホルダとして利用可能。 def func(): ... # 以下と等価 # def func(): # pass 2008年1月のPython3検討メーリングリスト*1より、Guido van Rossum氏*2による投稿を引用。 Some folk…
プログラミング言語C++において、オーバーロードされた関数群をテンプレートパラメータへ引き渡す方法。テンプレート引数の関数型を一意に推論できないため、ジェネリックラムダ式でラップする必要がある。テンプレート引数Fはラムダ式に対応する固有のクロ…
プログラミング言語Cの次期C2x(C23)言語仕様では、空のブレース{}を用いた配列・構造体の初期化が許容される。C++では当初からOK。 typedef struct S { int m1, m2; } S; // C17:ill-formed / C2x:OK / C++:OK int arr0[10] = {}; S obj0 = {}; // C:OK / C+…
プログラミング言語Cの次期C2x(C23)言語仕様に追加される#embedディレクティブについて。外部ファイルをバイナリデータとしてプログラムに埋込む機能。下記コードは、外部PNGファイル内容を生成プログラム中のuint8_t型配列として埋め込む例*1 *2。C17現在は…
プログラミング言語Cの次期仕様C2x(C23)では、式から型情報を取り出す typeof演算子(typeof operator) が追加される。 // C2x const int x = /*...*/; typeof(x) y; // const int型 typeof_unqual(x) z; // int型 int func(int); typeof(func)* pf; // int(*…
プログラミング言語Cの次期C2x(C23)言語仕様に追加される属性(→id:yohhoy:20200505)reproducible, unsequencedに関するメモ。関数呼び出しに対する最適化ヒント。 // C2x int calc(int x, int y) [[unsequenced]]; int a = /*...*/; int b = calc(a) * 2; …
プログラミング言語Cの次期仕様C2x(C23)にて、ついにC言語にも真のヌルポインタ定数nullptrがやってくる。 C++11(→id:yohhoy:20120503)から遅れること12年。 int *p1 = nullptr; // C2x以降 int *p2 = NULL; int *p3 = 0; まとめ: C/C++両言語のnullptrが…
プログラミング言語C標準規格における改行文字(new-line character)と改行コードCR, LFとの関係性について。まとめ: C標準規格ではプログラム内部で扱う「改行文字」と、外部ファイルにおける具体的なCR, LF等の「文字コード」を区別する。*1 *2 改行文字を…
プログラミング言語C++標準規格のサンプルコードでビートを刻むMCハマー。 "U Can't Touch This" ( 'ω' و(و♪ ƪ( 'ω' ƪ )♪ template<ranges::constant_range R> void cant_touch_this(R&&); vector<char> hammer = {'m', 'c'}; span<char> beat = hammer; cant_touch_this(views::as_const(beat)); /</char></char></ranges::constant_range>…
C++標準ライブラリのスマートポインタ型std::shared_ptr<T>では->*演算子オーバーロードを提供しない(注:->はあるよ)。 #include <memory> struct X { int mf(); }; // メンバ関数ポインタ int (X::*pmf)() = &X::mf; // (通常)ポインタ型 X* p = new X; p->mf(); //</memory></t>…
次期C++2b(C++23)標準ライブラリのコルーチンサポート型std::generator<Ref>(→id:yohhoy:20220801)の第1テンプレートパラメータRefと、オブジェクトのコピー/ムーブの関係性についてメモ。まとめ: 利用側にconst参照を提供:const-lvalue参照const T&…
次期C++2b(C++23)標準ライブラリに追加されるstd::generator<R>クラステンプレートについてメモ。提案文書P2502R2よりコード引用:*1 // C++2b #include <functional> #include <generator> #include <range> #include <utility> std::generator<int> fib() { auto a = 0, b = 1; while (true) { co_yield st</int></utility></range></generator></functional></r>…