C++標準ライブラリで提供されるstd::monostateは、単一値しか持たない ユニット型(Unit type) としても利用できる。*1std::monostateはデフォルト構築可能でコピー操作や比較演算全般をサポートする正則な(regular)型であり*2、クラステンプレート特殊化を必…
プログラミング言語Cの次期仕様C2yでは、16進数表記で用いられるアルファベット文字範囲'a'~'f'および'A'~'F'について文字コードの連続性保証が明文化される。この文字コード範囲での連続性保証は、ラテンアルファベット26文字 A~Z / a~z が連続配置され…
C++標準ライブラリの固定長配列型std::array<T, N>では、要素数ゼロN == 0が明示的に許容される。一方で、C++言語組込の配列型においては要素数ゼロが許容されない。*1C++11 8.3.4/p1, 23.3.2.8より一部引用。 In a declaration T D where D has the form D1 [ con</t,>…
プログラミング言語Cにおける配列添字演算子(array subscript operator)[]の伝統的かつ奇妙な言語仕様に関して、次期C2yをターゲットとした仕様修正が提案されている。小ネタ以外の使い道もなく修正されて良い頃合いかもね?*1 const char msg[] = "Hello"; …
C++20標準ライブラリのstd::strong_order関数オブジェクト*1は、IEEE 754準拠の浮動小数点数型に対する全順序比較(totalOrder predicate)を実装する。 #include <compare> #include <concepts> #include <iostream> #include <limits> #include <map> #include <string> template<std::floating_point T> struct totalOrder { static_</std::floating_point></string></map></limits></iostream></concepts></compare>…
CUDAアーキテクチャにおける自然なメモリアライメントは 256 バイト。CUDA提供のメモリ確保関数(cudaMalloc等)は、少なくとも 256 バイト・アライメントされたアドレスを返す。 Size and Alignment Requirement (snip) Any address of a variable residing…
プログラミング言語Cの次期仕様C2yでは、複素数型(_Complex float/double/long double)に対するインクリメント/デクリメントが正式サポートされる。gcc/Clangでは独自拡張としてサポート済み。 _Complex double c = 41.; ++c; // OK: C2y assert(c == 42.);…
C++2c(C++26)多次元部分ビューstd::submdspan(→id:yohhoy:20240201)によるメモリレイアウト変換のチートシート。変換結果std::mdspan<T,E,L,A>(→id:yohhoy:20230303)のレイアウトポリシーLは、変換元レイアウトマッピングのsubmdspan_mappingカスタマイズポイント</t,e,l,a>…
プログラミング言語C++の次期標準C++2c(C++26)から、if/while/for/switch構文の条件式(condition)部に構造化束縛(structured binding)を記述できる。 // C++2c if (auto [a, b] = func()) { // 関数戻り値からbool型への変換結果がtrueとなるときに限り // …
C++2c(C++26)標準ライブラリでは、ようやく <strstream> ヘッダが削除される。同ヘッダはC++ ISO標準化されたC++98当初から非推奨(deprecated)とされていた。代替機能として下記C++標準ヘッダが提供するクラス群を利用する。*1 <sstream> stringstream, istringstream, ostringst</sstream></strstream>…
Python言語のstructモジュールでは、フォーマット指定先頭文字(@/=/<>/!)にてメモリレイアウト指定を明示すべき。パック(pack)/アンパック(unpack)フォーマット文字列の省略時デフォルトのメモリレイアウトは、Pythonプログラマの期待に反する可能性が高い…
Windows OSのエラーコードに関するMicrosoft公式仕様書。HRESULT値/Win32エラーコード/NTSTATUS値を広範にカバーしている。 [MS-ERREF]: Windows Error Codes 関連URL HRESULT型からのエラーメッセージ取得 - yohhoyの日記
他クラスに対して “メンバ関数単位でのアクセス制限” を実現するイディオム。 template <class T> class Passkey { friend T; Passkey() {} }; class A; class B; class C { public: // クラスAに対してのみ公開 void mfA(Passkey<A>, int arg); // クラスBに対してのみ</a></class>…
C++2c(C++26)標準ライブラリに追加される<rcu>ヘッダについて。Read copy updateの略。 // C++2c #include <atomic> #include <mutex> // scoped_lock #include <rcu> struct Data { int m1; /*...*/ }; std::atomic<Data*> data_; // new確保された初期値が別途設定される前提 void multiple</data*></rcu></mutex></atomic></rcu>…
C++2c(C++26)標準ライブラリに追加される多次元部分ビューstd::submdspanについて。 // <mdspan>ヘッダ namespace std { template< class T, class E, class L, class A, class... SliceSpecifiers> constexpr auto submdspan( const mdspan<T, E, L, A>& src, SliceSpecifiers..</t,></mdspan>…
GCCコンパイラの -pedantic オプションについてメモ。 pedantic 形容詞 〈侮蔑的〉〔文法・学問的なことなどについて〕重要でない事にこだわり過ぎる、学者ぶった、知識をひけらかす、衒学的な https://eow.alc.co.jp/search?q=pedantic GCC 2.95.3マニュア…
プログラミング言語C++において、nodiscard属性が指定された関数に対し意図的な戻り値破棄を明示する方法。2024-07-05追記:C++2c(C++26)において提案文書P2968R2が採択され*1、方式(3) std::ignoreへの戻り値代入は明確にwell-definedとされる。まとめ: C+…
C++23標準ライブラリの多次元ビューstd::mdspan(→id:yohhoy:20230303)における、第4テンプレートパラメータAcssesorPolicyを用いた要素アクセスカスタマイズの具体事例。C++2c(C++26)標準ライブラリ採用が決定している線形代数基本アルゴリズム <linalg> ヘッダで</linalg>…
C++標準ライブラリ提供レンジアダプタstd::views::filter適用後の要素に対する変更操作には十分留意すること。変更操作により要素がフィルタ条件を満たさなくなる場合、C++ライブラリ仕様上は未定義動作(undefined behavior)を引き起こす。この問題は遅延評…
プログラミング言語C++標準規格の索引(Index)に紛れ込むリビングデッド。*1 brains names that want to eat your, [zombie.names]living dead name of, [zombie.names] https://github.com/cplusplus/draft/commit/e844e0f45550eb0bf11ea262e4abd8a5403f47d4…
プログラミング言語Cの次期仕様C2yに向けて、式の評価順序を厳格に規定する提案 N3203 Strict order of expression evaluation が提出されている。チャレンジングなお話。C言語(C++も同様)では歴史的経緯から、演算子オペランドの評価順*1や関数実引数リス…
C++2c(C++26)標準ライブラリに追加される飽和演算(saturation arithmetic)サポートについてメモ。 // C++2c <numeric>ヘッダ namespace std { // T,U = 符号付き整数型 or 符号無し整数型 template<class T> constexpr T add_sat(T x, T y) noexcept; template<class T> constexpr T sub</class></class></numeric>…
プログラミング言語C++において、異なる基底クラスに属する同名メンバ関数*1を個別にオーバーライドする方法。 // 同名メンバ関数をカスタマイズポイントとして提供する // 互いに無関係なインタフェースクラス struct Interface1 { virtual void process() …
プログラミング言語C/C++の次期標準規格C2x(C23)およびC++2c(C++26)では、アサーションマクロassertの改善が行われる。 #include <assert.h> // C/C++ #include <cassert> // C++のみ int is_valid(int); assert( "42 shall be vaild", is_valid(42) ); // NG: C17/C++20現在 //</cassert></assert.h>…
C++17以降のC++標準ライブラリ仕様では、signal関数のプロトタイプ宣言が読みやすく書き直されている。 C++17仕様 C++標準ライブラリ仕様としてプロトタイプ宣言が行われている。C++17 21.10.3より宣言を引用: Header <csignal> synopsis namespace std { // 21.10.4</csignal>…
C++標準ライブラリで使われるタグ型(tag type)とタグ値の実装イディオム。デフォルトコンストラクタへのexplicit指定は、{}によるタグ型(mytag_t)デフォルト構築を禁止するため。 struct mytag_t { explicit mytag_t() = default; }; inline constexpr mytag…
macOS Big Sur 11.0.1以降では、システム提供される共有ライブラリファイル(dylib)はファイルシステム上に実体が存在しない。macOS Big Sur 11.0.1 リリースノートより引用(下線部は強調)。 New in macOS Big Sur 11.0.1, the system ships with a built-i…
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>…