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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容