C++ 23: 不允许连接非相同类型的宽字符串

在C++ 中,连续的两个或多个字符串常量会在翻译期被连接在一起,例如

auto concatedStr = "Hello," "World";
<=>
auto concatedStr = "Hello,World";

然而,对于下面的这些例子

{ 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""; }

行为是不确定的,依赖于编译器的具体实现。不幸的是,常用的编译器,msvc,gcc,clang都没有完美的支持这些字符串常量的连接,所以,C++ 23 提出,直接将这些例子定义为 ill-formed
标准规定:
挨着的两个字符串常量会在翻译阶段被连接。如果两个字符串常量有同样的编码前缀,则连接后的字符串的编码前缀与之相同;如果只有一个字符串常量有编码前缀,则连接后的字符串常量的编码前缀与之相同;其他形式的连接都是ill-fromed

你可能感兴趣的:(C++ 23: 不允许连接非相同类型的宽字符串)