yohhoyの日記

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

-fassume-nothrow-exception-dtorオプション

LLVM/Clangでは「C++例外オブジェクトのデストラクタで例外送出しないと仮定する」コンパイルオプション-fassume-nothrow-exception-dtorが提供される。こんな邪悪な例外クラスを扱うユースケースは無いだろうが、C++言語仕様上は禁止されていない。 // デス…

冗長なtypenameキーワード

C++

プログラミング言語C++において型(type)名を記述するとき、C++11以降では修飾名(qualified name)に限って冗長なtypenameキーワードを記述しても良い。 #include <cstddef> using std::size_t; struct S { using type = int; }; typename int x0; // NG typename size_</cstddef>…

型パックからのインデクス指定

プログラミング言語C++において、テンプレートパラメータパック(template parameter pack)からインデクス指定で型(type)を選択する方法。C++2c(C++26)以降では直接的な記述が可能となる。 #include <tuple> // C++11 template <std::size_t Idx, typename... Ts> using Selector = typename std::tupl</std::size_t></tuple>…

unitbufマニピュレータ

C++

C++標準ライブラリのI/Oストリームにおける知名度の低いマニピュレータ(manipulator)。*1出力ストリームに対して出力操作毎のフラッシュ(flush)を指示する。*2 #include <iostream> int x = 42; std::cout << std::unitbuf; std::cout << "x=" << x << "\n"; // operat</iostream>…

"obsolescent feature" in 標準C

C

プログラミング言語C標準規格に登場する「廃止予定の機能(obsolescent feature)」の意味を正確に規定する提案が提出されている。 Motivation Mixing the terms "obsolete", "obsolescent", "deprecated", and "removed", despite distinctions in their mean…

fflush(NULL);

C

C標準ライブラリ関数fflushにヌルポインタを指定すると、プログラムが現在開いている全てのストリームをフラッシュする。 fflush(NULL); // OK C99 7.19.5.2/p1-3より引用(下線部は強調)。 #include <stdio.h> int fflush(FILE *stream); 2 If stream points to an </stdio.h>…

_Exit/_exitはストリームをフラッシュしない

C標準ライブラリ_Exit関数およびPOSIX準拠_exit関数は、プログラムを異常終了させるC標準abort関数と同様に開いているストリーム(FILE型)をフラッシュしない*1。ログファイルや標準出力(stdout)への出力欠落に注意。一方で、C標準ライブラリexit関数ではス…

bit_castマクロ for C言語

C

プログラミング言語Cにおいて、ビット表現を維持したまま型変換を安全に行うマクロ。C++標準ライブラリのstd::bit_cast<To>(from)相当。本記事の内容はStackOverflowで見つけた質問と回答に基づく。 // C99 : 右辺値に未対応 #define bit_cast(T, ...) \ (*((T*)</to>…

C++ Standard Evolution Viewer

C++

プログラミング言語C++の国際標準規格(ISO/IEC 14882)バージョン間差分を、セクション別に確認できるWebサイト。 https://cppevo.dev/

C++26 std::execution

本文こちら→C++ MIX #16に参加しました - yohhoyの日記(別館)スライド資料:https://www.docswell.com/s/yohhoy/ZQXJ2E-cpp26-execution関連URL C++26 Executionライブラリ(基礎編) - yohhoyの日記 C++26 Executionライブラリ(Senderアルゴリズム編) -…

C++26 Executionライブラリ:非同期スコープ

C++2c(C++26)実行制御ライブラリ(execution control library)(→id:yohhoy:20250609)における非同期操作の早期開始と非同期スコープについて。Sender型で表現されたタスクチェインに対して、非同期操作の開始要求と完了待機を一括実施する遅延開始(lazy sta…

式static_assert in C言語

C C2y

プログラミング言語Cにおいて、式(expression)として扱えるコンパイル時アサートの実装例(C11以降)。*1 *22026-02-15追記:次期標準C2y向けに提案文書(PDF)N3715が採択され、関数形式マクロでの利便性向上を目的としてstatic_assert(cexp[, msg])構文を式(…

C++26 Executionライブラリ:Sender完了シグネチャ集合

C++2c(C++26)実行制御ライブラリ(execution control library)(→id:yohhoy:20250609)において、Sender型の完了シグネチャ集合(set of completion signatures)の宣言方法。[P3557R3採択後WD N5014*1準拠]自作SenderクラスMySenderの完了シグネチャ集合は、…

クラステンプレート特殊化型判定 @ C++26

プログラミング言語C++において、与えられた型があるクラステンプレートの特殊化(specialization)か否かを判定する方法。id:yohhoy:20220122のC++2c(C++26) Reflection(→id:yohhoy:20250305)バージョン。自明な実装で面白みはない... // C++2c(C++26) #inc…

constexpr Two-Step

C++20からサポートされたコンパイル時動的確保データを、コンパイル時定数としてプログラム実行時へと効率的に持ち越すテクニック。C++23現在の言語仕様では、コンパイルフェーズで動的確保(new)されたデータ領域はコンパイルフェーズにおいて解放(delete)さ…

C++26 Executionライブラリ:Cancellable Sender

C++2c(C++26)実行制御ライブラリ(execution control library)(→id:yohhoy:20250609)において、キャンセル可能なSenderの実装方法。実行制御ライブラリにおける非同期操作のキャンセルは、Receiver側で発行された停止要求(stop request)をSender側が明示的…

C++26 Executionライブラリ(コルーチン相互運用編)

C++2c(C++26)標準ライブラリに追加される実行制御ライブラリ(execution control library)についてメモ。別名:std::execution, Senders/Receivers(S/R)2025年5月現在、ベースライン提案文書P2300R10までを採択済み。 2025-07-20追記:2025年6月会合にて関連…

C++26 Executionライブラリ(Senderアルゴリズム編)

C++2c(C++26)標準ライブラリに追加される実行制御ライブラリ(execution control library)についてメモ。別名:std::execution, Senders/Receivers(S/R)2025年5月現在、ベースライン提案文書P2300R10までを採択済み。 2025-07-20追記:2025年6月会合にて関連…

C++26 Executionライブラリ(基礎編)

C++2c(C++26)標準ライブラリに追加される実行制御ライブラリ(execution control library)についてメモ。別名:std::execution, Senders/Receivers(S/R)2025年5月現在、ベースライン提案文書P2300R10までを採択済み。 2025-07-20追記:2025年6月会合にて関連…

配列要素数の取得 in 標準C

C C2y

プログラミング言語Cの次期標準C2yでは、配列要素数を安全に取得する_Countof演算子が導入される。オペランドに配列型を要求すること以外は、構文規則的にsizeof演算子とほぼ同じ。 // C2y int fibs[] = { 1, 1, 2, 3, 5, 8, 13, 21 }; static_assert(_Count…

Range挿入操作と要素オーバーラップ

C++

C++23標準ライブラリのシーケンスコンテナ*1に対するRange挿入操作では、挿入先コンテナと挿入元Rangeとの要素オーバーラップが{append,prepend}_range操作でのみ許容される。それ以外のメンバ関数で要素オーバーラップしていた場合は未定義動作(undefined b…

C++ Reflection(P2996R10)

次期C++2c(C++26)標準規格に向けて検討が進んでいる リフレクション(reflection) についてメモ。本記事の内容は提案文書 P2996R10 に基づく。2025-07-18追記:2025年6月会合にてP2996R13[言語コア機能とライブラリ]、および一連の関連提案P3560R2[エラー…

Expansion statement for C++

プログラミング言語C++の次期標準C++2c(C++26)向けに提案されている展開文(Expansion statement)について。template for構文をもちいて本体処理を反復的にコンパイル時展開する。2025-06-22追記:2025年6月会合にてP1306R5が採択され*1、C++2c言語仕様に展開…

サンプルコードによるC++23ジェネレータの紹介

C++

サンプルコードによるC++23ジェネレータの紹介本文こちら→C++ MIX #13に参加しました - yohhoyの日記(別館)スライド資料:https://www.docswell.com/s/yohhoy/KEXQPG-cpp23gen関連URL コルーチン×ラムダ式キャプチャ=鼻から悪魔 - yohhoyの日記 std::gene…

declcall演算子

プログラミング言語C++の次期標準C++2c(C++26)に導入されるdeclcall演算子についてメモ。declcall演算子は関数呼び出しを含む式をオペランドにとり、オーバーロード解決後の関数ポインタ/メンバ関数ポインタを返す定数式(constant expression)となる。この…

名前付きループ in 標準C

C C2y

プログラミング言語Cの次期標準C2yでは、名前付きループ(Named Loop)構文としてbreak/continue文へのラベル指定がサポートされる。 // C2y outer: for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { break; // 内部ループ脱出: 1)へ break oute…

8進数リテラルプレフィクス in 標準C

プログラミング言語Cの次期標準C2yでは、8進数リテラルプレフィクス0o/0Oが導入される。 // C2y int n1 = 0o52; // 42 int n2 = 0O52; // 42 int n0 = 052; // 42 (従来記法; 廃止予定) 0o/0Oプレフィクス追加と同時に、数値0のみプレフィクスとする従来8…

OpenMP 6.0仕様リリース

2024年11月 OpenMP 6.0仕様リリース記事 https://www.openmp.org/home-news/openmp-arb-releases-openmp-6-0-for-easier-programming/ より抄訳。OpenMP仕様バージョン6.0はOpenMP ARB、主要なコンピュータハードウェア/ソフトウェアベンダーのグループ、そ…

i += 1 + ++i; の処理結果(Go/Rust編)

異なるプログラミング言語における式i += 1 + ++i処理結果の違いについて。番外編。 // Go var i = 0 i += 1 + ++i // ?? // Rust let mut i = 0; i += 1 + ++i; // ?? まとめ: Go:コンパイルエラー Rust:コンパイルエラー Java/JavaScript/C#:値2(→i…

i += 1 + ++i; の処理結果(C/C++編)

C C++

異なるプログラミング言語における式i += 1 + ++i処理結果の違いについてメモ。警告:1つの式内で同一変数を複数回更新する技巧的なコード記述は避けてください。DO NOT WRITE THIS ON PRODUCTION CODE. sequenced-before関係ルールを覚えてまで際どいコード…