このページはC++23に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
C++20までは、実装定義の動作としてL""
、u8""
、u""
、U""
のようなエンコーディングが混在する文字列リテラルの連結を条件付きで許可していたが、これを禁止とする。
// C++20 : 実装定義として条件付きでOK
// (ただし主要コンパイラはサポートしていない)
// C++23 : NG
void f() {
{ auto a = L"" u""; }
{ auto a = L"" u8""; }
{ auto a = L"" U""; }
{ auto a = u8"" L""; }
{ auto a = u8"" u""; }
{ auto a = u8"" U""; }
{ auto a = u"" L""; }
{ auto a = u"" u8""; }
{ auto a = u"" U""; }
{ auto a = U"" L""; }
{ auto a = U"" u""; }
{ auto a = U"" u8""; }
}
異なるエンコーディングを混在させた文字列リテラルの連結は、ICC、GCC、Clang、MSVCのいずれもサポートしておらず、それが有用なケースは知られていなかったため禁止する。