yohhoyの日記

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

C++コルーチン送出例外のハンドリング戦略

C++

C++20コルーチンからの例外送出ハンドリングに関するメモ。C++コルーチンライブラリの設計者向け。C++コルーチン言語仕様では、コルーチン送出例外ハンドリングのカスタマイズポイントとしてpromise_type::unhandled_exception関数を規定する。プログラマが…

コルーチン×ラムダ式キャプチャ=鼻から悪魔

C++

C++20 コルーチンとキャプチャありラムダ式の組合せは、キャプチャ変数の生存期間(lifetime)切れによる未定義動作(undefined behavior)を引き起こすリスクが高く、原則として併用すべきでない。要約:ラムダ式でキャプチャした変数はコルーチン中断時にコル…

1 << 31 == ?

C++

C++言語における符号付き整数型の左ビットシフト<<と符号ビットの関係について。まとめ: 2の補数表現が保証されたC++20現在、左ビットシフト<<は論理左シフト(logical left shift)が保証される。 おまけ:C++20現在、右ビットシフト>>は算術右シフト(arithm…

Preconditions: false is true.

C++2b(C++23)向けに提案されているコード不到達表明std::unreachable関数の前提条件。「false is true」は常に成り立たない(恒偽命題)ため、unreachable関数呼び出しは必ず未定義動作(undefined behavior)を引き起こす。つまり…どういうことだってばよ?C+…

2進数フォーマット出力 in 標準C

プログラミング言語Cの次期C2x(C23)標準ライブラリのprintf関数ファミリでは、変換指定子bによる2進数フォーマット出力がサポートされる。同時にscanf関数ファミリやstrtoT関数では0bプレフィクス付き文字列入力がサポートされる。*1 // C2x #include <stdio.h> print</stdio.h>…

自己再帰するラムダ式 @ C++23

次期C++2b(C++23)言語仕様に追加される Deducing this により、自己再帰するラムダ式を自然に記述できるようになる。ラムダ式の第1引数型this autoで宣言されるselfは explicit object parameter と呼ばれ、ここではラムダ式自身のクロージャ型(closure type…

OpenMP 最長コンストラクト

OpenMPの最長コンストラクト*1 Target Teams Distribute Parallel Worksharing-Loop SIMD Construct。 // OpenMP 4.0 for C/C++ #pragma omp target teams distribute parallel for simd /*for-loops*/ 関連URL OpenMP 4.0仕様リリース - yohhoyの日記 https…

typeof null == 'object'

バグは夜更け過ぎに仕様に変わるだろう*1 -- 詠人知らず // This stands since the beginning of JavaScript typeof null === 'object'; In the first implementation of JavaScript, JavaScript values were represented as a type tag and a value. The ty…

signatureの定義 @ C++20

C++

C++20以降での関数シグネチャ(signature)の定義について。Concepts導入によりテンプレート制約も追加で考慮される。まとめ: 関数:名前、引数型リスト、所属する名前空間(戻り値型は除外) 関数テンプレート:名前、引数型リスト、戻り値型、所属する名前…

std::coutの実体はどこ?

C++標準ライブラリで定義されるグローバルオブジェクトstd::cout等の宣言と定義についてメモ。GCC/libstdc++およびClang/libcxxライブラリ実装では、宣言型(std::ostream)と実体定義の型(char[])を意図的に変えている。型の不一致は厳密にはC++仕様違反*1だ…

realloc(ptr, 0)は廃止予定

C標準ライブラリrealloc関数に対して、サイズ0を指定すべきでない。realloc(ptr, 0)によってptrが指すメモリブロックが解放(free(ptr)相当)される保証はない。この動作は ISO C および POSIX それぞれで明言されている。JPCERT MEM04-C サイズ0のメモリ割…

レンジ to コンテナ変換

次期C++2b(C++23)標準ライブラリに向けて、Rangesから各種コンテナ型への直接変換サポートが検討されている。(PDF)P1206R6では下記の機能追加/拡張を提案している。 コンテナ型Cへの変換std::ranges::to<C>レンジアダプタ(range adaptor) 標準コンテナへのstd:</c>…

Last Piece of ラムダ式への属性指定

C++20現在の言語仕様では、ラムダ式に対して(普通のプログラマが期待するであろう)属性指定は行えない。C++2b(C++23)に向けた提案(PDF)P2173R0が進行中。*1下記コードはC++構文規則上は許容されるものの、ラムダ式の戻り値に対するnodiscard属性指定ではな…

可変長コンセプト×畳み込み式: The glass is half full or half empty?

C++

C++20コンセプトと論理演算子(&&, ||)による畳み込み式(fold expression)の関係について。本記事の内容はStackOverflowで見つけた質問と回答に基づく。まとめ:&&と||による畳み込み式を用いた制約式(constraint-expression)は機能するものの、コンセプト間…

requires式中でのコンセプト制約表現には要注意

C++

C++20 requires式(requires-expression) において、コンセプトや条件式を用いた制約(constraints)表現には注意が必要。下記コードのように式std::signed_integral<decltype(N)>やN == 42をrequires式中に単に記載すると単純要件(simple-requirement)となり、式の妥当性の</decltype(n)>…

HRESULT型からのエラーメッセージ取得

WindowsOS環境のHRESULT型エラーコードからエラーメッセージ文字列へのお手軽変換。Microsoft Visual C++(MSVC)限定。 #include <windows.h> #include <system_error> std::string get_message(HRESULT hr) { return std::system_category().message(hr); } // GetLastError()戻り値な</system_error></windows.h>…

ジュラシック・パーク in C++ Standard

C++

プログラミング言語C++標準規格に潜む恐竜たち。C++20(N4861) D.5 Deprecated volatile typesより引用。*1 1 Postfix ++ and -- expressions (7.6.1.5) and prefix ++ and -- expressions (7.6.2.2) of volatile-qualified arithmetic and pointer types are…

RangeとViewとconst修飾

C++

C++20 RangesライブラリのRangeとViewとconst修飾の関係についてメモ。まとめ: 対象Rangeのconst修飾(要素の変更可否)と、Viewのconst修飾(const-iterableの可否)は異なる概念である。 C++20標準ライブラリ提供の一部Rangeアダプタでは、const修飾によ…

Rangeアダプタ std::view::reverse

C++20 Rangesライブラリの逆順ビューstd::ranges::reverse_viewおよびRangeアダプタstd::views::reverse*1についてメモ。 基本の使い方 範囲for構文とRangeアダプタreverseを組み合わせて、配列や文字列やコンテナなどRangeとして扱えるものを逆順に列挙でき…

std::views::splitで文字列分割 @ C++23

次期C++2b(C++23) Rangesライブラリstd::views::splitとstd::string_viewを利用した文字列分割処理。C++標準ライブラリのアップデートによりC++20時点よりシンプルに記述可能となり、またstd::stringを介さないため実行効率改善も見込める。 // C++2b(C++23)…

SensorManager.GRAVITY_DEATH_STAR_I

Androidでは初代デス・スター(Death Start I)の重力加速度定数が提供される。Android API Level 1からの超古参。 public static final float GRAVITY_DEATH_STAR_I Gravity (estimate) on the first Death Star in Empire units (m/s^2)Constant Value: 3.53…

#elifdefと#elifndef

プログラミング言語C/C++のそれぞれ次期バージョンC2x(C23)/C++2b(C++23)では、新しいプリプロセッサディレクティブ#elifdefと#elifndefが追加される予定。*1 #ifdef identifier:#if defined(identifier)と等価 #ifndef identifier:#if !defined(identifie…

James Bond in C++ Standard

C++

プログラミング言語C++標準規格の索引(Index)に紛れ込むジェームズ・ボンド。 [expr.prim.lambda] Add index entry for example of *this capture. https://github.com/cplusplus/draft/commit/703d892264af814a64140b17ffe2bf6ae9274dde 関連URL https://tw…

WG14 redirect service

C

タイトル通り。ISO/IEC JTC1/SC22/WG14サイト各種文書への短縮リンク提供サービス。 wg14.link/nXXXX Get document.wg14.link/{c99,c11,c18,c2x} Get latest working draft. https://wg14.link/ 関連URL WG21 redirect service - yohhoyの日記

OpenMP 5.1仕様リリース

2020年11月 OpenMP 5.1仕様リリース記事 OpenMP ARB releases OpenMP 5.1 with Vital Usability Enhancements より抄訳。OpenMP仕様バージョン5.1はOpenMP ARB、主要なコンピュータハードウェア/ソフトウェアベンダのグループ、そしてOpenMPコミュニティの…

制約式std::bool_constant<cond>::value

C++

C++20 制約式(constraint-expression)でテンプレートパラメータに依存する定数条件式condを表現する場合、非定数式に起因するハードエラーを防ぐためstd::bool_constant<cond>::valueと記述する必要がある。 #include <type_traits> struct X { // X::valueは非定数式 static in</type_traits></cond>…

2進数リテラル in 標準C

C C2x

プログラミング言語Cの次期仕様C2x(C23)では 2進数リテラル(binary literal) が正式仕様となる。そこ今更とか言わない。 // C2x unsigned x = 0b101010; unsigned y = 0B11110000; ノート:2003年時点の (PDF) Rationale for International Standard Program…

std::is_convertible vs. std::convertible_to

C++

C++標準ライブラリstd::is_convertibleメタ関数とstd::convertible_toコンセプトの超微妙な違い。本記事の内容はStackOverflowで見つけた質問と回答に基づく。要約: is_convertible<From, To>メタ関数:From型からTo型へ暗黙変換できることを検査する。 convertible_to<From, To></from,></from,>…

非staticデータメンバを判定する制約式

C++

C++20 requires式(requires-expression)の単純な利用では非static/staticメンバを区別できない。requires式の本体部は評価されない(unevaluated)ため、通常コードとは異なる規則が適用されることに注意。 // staticメンバmを持つ型X struct X { static cons…

"Poison-pill" overload for CPO

C++

C++20標準ライブラリで導入された Customization Point Object (CPO)定義で必要となる Poison-pill*1 オーバーロードについてメモ。std::ranges::swapやstd::ranges::begin/endなどのCPO定義で利用される。本記事の内容はStackOverflowで見つけた質問と回答…