このページはC++23に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
C++20までは、以下のような、プリプロセッサ上での文字リテラルの比較と、if文での文字リテラルの比較が同じであるという保証がなかった。
#if 'A' == '\x41'
//...
#endif
if ('A' == 0x41){}
プリプロセッサとそれ以外の文字列リテラルの解釈が一致するかどうかは実装定義となっていたが、これをプリプロセッサの文字列リテラルの解釈がプリプロセッサ外と一致するよう規定する。
この機能が必要になった背景・経緯
1500以上のオープンソースプロジェクトを調査したところ、このような#if
マクロは、文字列リテラルのナロー文字エンコーディングを検出するために使われていた。
主要なコンパイラはすべて期待通りに動作していたが、プリプロセッサではナロー文字エンコーディングの保証がなかったため、通常の文字リテラルと同じ規定とすることでこの動作を保証することとした。