当带前缀的字符串与无前缀的字符串相邻时,字符串文本串联失败

String literal concatenation fails when prefixed string is adjacent to non-prefixed string?

本文关键字:字符串 前缀 文本 失败      更新时间:2023-10-16

在我认为符合C++11的MSVS2013中,编译器不喜欢以下内容:

LPCTSTR str = _T("boo " "hoo");

翻译过来就是:

wchar_t const * str = L"boo " "hoo";

根据cppreference.com(我知道这不是决定性的,但这是我目前唯一的参考):

  • 并排放置的字符串文字在编译过程中连接在一起。也就是说,"Hello"、"world!"产生(单个)字符串"Hello,world。
    • 如果两个字符串具有相同的编码前缀(或两者都没有),则生成的字符串将具有相同的代码前缀(或没有前缀)
    • 如果其中一个字符串有编码前缀,而另一个没有,那么没有编码前缀的字符串将被视为与另一个具有相同的编码前缀
    • 如果UTF-8字符串文字和宽字符串文字并排,则表示程序格式不正确
    • 编码前缀的任何其他组合可能被实现支持,也可能不被实现支持。这种串联的结果是实现定义的

重点是我自己。

有人能确认这是否在cpprreference所示的标准中吗?

编辑

不喜欢,我的意思是我得到以下错误:

error C2308: concatenating mismatched strings

2003年ISO C++标准第2.13.4p3节规定:

在翻译阶段6(2.1)中,相邻的窄字符串文字为级联的和相邻的宽字符串文字被级联。如果窄字符串文字标记与宽字符串文字相邻标记,行为未定义。串联字符串中的字符保持不同。

2011年标准第2.14.5p13节规定:

在翻译阶段6(2.2)中,相邻的字符串文字为级联。如果两个字符串文字具有相同的编码前缀,得到的连接字符串文本具有编码前缀。如果一个字符串文字没有编码前缀,则将其视为与其他操作数具有相同编码前缀的字符串文字。如果UTF-8字符串文字标记与宽字符串文字标记相邻,这个程序格式不正确。任何其他串联都是有条件的由实现定义的行为支持。

因此序列L"boo " "hoo"在C2003中具有未定义的行为,但在C2011中被很好地定义并等价于L"boohoo"

根据您提供的信息,我无法判断MSVS2013是否符合C++11。你说它"不喜欢"这个结构,但如果不喜欢被表达为一个非致命的警告,并且语义符合2011年标准的规定,那么它可能是符合的。

您能更新问题以显示诊断消息吗?

来自N3797,§2.14.5/13[lex.string]

在翻译阶段6(2.2)中,相邻的字符串文字为级联。如果两个字符串文字具有相同的编码前缀,得到的连接字符串文字具有该编码前缀。如果一个字符串文字没有编码前缀,它被视为字符串与其他操作数具有相同编码前缀的文字。

下表甚至列出了一个与相同的示例

// Source         Means
L"a" "b"          L"ab"

所以我认为您的代码格式良好,这是一个VisualStudio错误。