最終更新日時(UTC): 2025年07月10日 01時26分30秒
Koichi Murase が更新

履歴 編集

# 文字リテラルエンコーディングを一貫させる [P2316R2](C++23)

このページはC++23に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

C++20までは、以下のような、プリプロセッサ上での文字リテラルの比較と、if文での文字リテラルの比較が同じであるという保証がなかった。

    #if 'A' == '\x41'
    //...
    #endif
    if ('A' == 0x41){}

プリプロセッサとそれ以外の文字列リテラルの解釈が一致するかどうかは実装定義となっていたが、これをプリプロセッサの文字列リテラルの解釈がプリプロセッサ外と一致するよう規定する。

## この機能が必要になった背景・経緯

1500以上のオープンソースプロジェクトを調査したところ、このような`#if`マクロは、文字列リテラルのナロー文字エンコーディングを検出するために使われていた。

主要なコンパイラはすべて期待通りに動作していたが、プリプロセッサではナロー文字エンコーディングの保証がなかったため、通常の文字リテラルと同じ規定とすることでこの動作を保証することとした。

## 参照

- P2316R2 Consistent character literal encoding