yohhoyの日記

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

2023-01-01から1年間の記事一覧

std::views::filter適用後の値書換えには要注意

C++

C++標準ライブラリ提供レンジアダプタstd::views::filter適用後の要素に対する変更操作には十分留意すること。変更操作により要素がフィルタ条件を満たさなくなる場合、C++ライブラリ仕様上は未定義動作(undefined behavior)を引き起こす。この問題は遅延評…

Living Dead/Zombie in C++ Standard

C++

プログラミング言語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…

厳格な式の評価順序 for C2y

C C2y

プログラミング言語Cの次期仕様C2yに向けて、式の評価順序を厳格に規定する提案 N3203 Strict order of expression evaluation が提出されている。チャレンジングなお話。C言語(C++も同様)では歴史的経緯から、演算子オペランドの評価順*1や関数実引数リス…

飽和演算サポート @ C++26

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

プログラミング言語C++において、異なる基底クラスに属する同名メンバ関数*1を個別にオーバーライドする方法。 // 同名メンバ関数をカスタマイズポイントとして提供する // 互いに無関係なインタフェースクラス struct Interface1 { virtual void process() …

NEO assertマクロ

プログラミング言語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>…

signal関数プロトタイプ宣言

C C++

C++17以降のC++標準ライブラリ仕様では、signal関数のプロトタイプ宣言が読みやすく書き直されている。 C++17仕様 C++標準ライブラリ仕様としてプロトタイプ宣言が行われている。C++17 21.10.3より宣言を引用: Header <csignal> synopsis namespace std { // 21.10.4</csignal>…

タグ型の実装イディオム

C++

C++標準ライブラリで使われるタグ型(tag type)とタグ値の実装イディオム。デフォルトコンストラクタへのexplicit指定は、{}によるタグ型(mytag_t)デフォルト構築を禁止するため。 struct mytag_t { explicit mytag_t() = default; }; inline constexpr mytag…

共有ライブラリファイル on macOS

Mac

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

C++20言語機能を利用した、ある式がコンパイル時に評価可能かを判定するメタ関数的なもの。id:yohhoy:20190528 の別解。本記事の内容はStackOverflowで見つけた質問と回答に基づく。 // C++20以降 template<class Lambda, int = (Lambda{}(), 0)> constexpr bool is_constexpr(Lambda) { return tr</class>…

関数名/メンバ関数名とアドレス演算子

C++

プログラミング言語C++において、通常関数名やstaticメンバ関数名から関数ポインタ型へは暗黙変換が行われるが、メンバ関数名からメンバ関数ポインタ型への変換はアドレス演算子&利用が必須。 void f0(); struct S { static void f1(); void mf(); }; // (通…

std::destructibleコンセプト

C++

C++20標準ライブラリstd::destructible<T>コンセプトに関するメモ。ある型Tが「例外送出なしにデストラクト可能」と制約(constraint)するコンセプト。デストラクタは既定で暗黙のnothrow指定が行われるため*1、明示的にnothrow(false)指定を行わない限りあらゆ</t>…

std::expectedと強い例外安全性

C++2b(C++23)標準ライブラリに追加されるstd::expected<T, E>の例外安全性についてメモ。正常型T/エラー型Eを値(value)として取り扱いつつ「強い例外安全性(Strong exception safety)」を満たすために、テンプレートパラメータに一定の制約が課される。 ムーブ/</t,>…

AutoClosable#closeメソッドのべき等要件

プログラミング言語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となることに注意。 /…

std::mdspan×空間充填曲線

C++2b(C++23)標準ライブラリの多次元ビューstd::mdspanクラステンプレート(→id:yohhoy:20230303)は、第3テンプレートパラメータLayoutPolicyを介して任意のメモリレイアウトをサポートする。*1C++2b標準ライブラリは、多次元配列表現としてメジャーな行優…

0次元std::mdspan

C++2b(C++23)標準ライブラリの多次元ビューstd::mdspanクラステンプレート(→id:yohhoy:20230303)では、0次元(rank-0)ビューをサポートする。意味論上は “単一変数へのポインタ” に相当する。(´-`).。oO(使うことあるか?) 2024-02-01追記:C++2c(C++26)…

std::mdspanコンストラクタとCTAD

C++2b(C++23)標準ライブラリに追加される多次元ビューstd::mdspanクラステンプレート(→id:yohhoy:20230303)の、コンストラクタと推論ガイド(deduction guide)による実引数クラステンプレート推論(CTAD; Class Template Argument Deduction)のあれこれ。mds…

std::mdspan

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

ヌル終端文字列のstd::hash計算

C++

C++標準ライブラリのハッシュ計算ファンクタstd::hashを用いてヌル終端文字列のハッシュ計算を行う場合、ポインタ型に対するstd::hash<const char*>特殊化ではなくstd::hash<std::string_view>特殊化を用いる。*1下記コードにあるh0では、“文字列” からではなくアドレス値からハッシュ計算さ</std::string_view></const>…

static_assert(false, "was wrong");

C++

プログラミング言語C++におけるconstexpr if文とstatic_assert宣言の組合せに関するメモ。2023年2月会合にてstatic_assert(false)を許容するP2593R1がCWG 2518へと統合され*1、C++言語仕様に対するDefect Reportとして遡及適用される。*2CWG 2518適用前のC++…

std::monostateのハッシュ値

C++標準ライブラリの直和データ型std::variant<...>と組み合わせて空の状態を表すstd::monostateオブジェクトでは、std::hashによるハッシュ計算がサポートされる。*1各C++処理系で算出されるハッシュ値の一覧(括弧内は併記コメント/定数名): GCC: -7777…

TemplateParam = void

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