当前缀字符串与非前缀字符串相邻时,字符串文字串联会失败吗?

时间:2013-12-19 16:51:03

标签: c++ visual-studio c++11

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

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

转换为:

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

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

  • 并行放置的字符串文字在编译期间连接在一起。那就是“你好”,“世界!”产生(单个)字符串“Hello,world!”。
    • 如果两个字符串具有相同的编码前缀(或者两者都没有),则生成的字符串将具有相同的编码前缀(或没有前缀)。
    • 如果其中一个字符串具有编码前缀而另一个不具有编码前缀,那么不会将其视为与另一个字符串具有相同的编码前缀。
    • 如果UTF-8字符串文字和宽字符串字面并排,则程序格式错误。
    • 实现可能支持也可能不支持编码前缀的任何其他组合。这种串联的结果是实现定义的。

重点是我自己。

任何人都可以确认这是否符合cppreference指示的标准?

修改

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

error C2308: concatenating mismatched strings

2 个答案:

答案 0 :(得分:5)

2003 ISO C ++标准2.13.4p3节说:

  

在翻译阶段6(2.1)中,相邻的窄字符串文字是   连接和相邻的宽字符串文字连接在一起。如果一个   窄字符串文字标记与宽字符串文字相邻   令牌,行为未定义。连接字符串中的字符   保持清晰。

2011年标准2.14.5p13节说:

  

在翻译阶段6(2.2)中,相邻的字符串文字是   级联。如果两个字符串文字都具有相同的 encoding-prefix ,   生成的连接字符串文字具有 encoding-prefix 。   如果一个字符串文字没有 encoding-prefix ,则将其视为a   与另一个操作数相同的encoding-prefix的字符串文字。如果一个   UTF-8字符串文字标记与宽字符串文字标记相邻,   该计划格式不正确。任何其他连接都是有条件的   支持实现定义的行为。

因此,序列L"boo " "hoo"在C2003中具有未定义的行为,但在C2011中定义明确且等同于L"boohoo"

我无法从您提供给我们的信息中看出MSVS2013是否符合C ++ 11。你说它“不喜欢”这个构造,但是如果不喜欢被表达为非致命的警告并且语义符合2011年标准中的规定,那么它可能是符合的。

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

答案 1 :(得分:3)

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

  

在翻译阶段6(2.2)中,相邻的字符串文字是   级联。如果两个字符串文字都具有相同的encoding-prefix,   生成的连接字符串文字具有该encoding-prefix。如果   一个字符串文字没有编码前缀,它被视为一个字符串   与另一个操作数相同的编码前缀的文字。

下面的表格甚至列出了一个与你所展示的相同的例子

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

所以我说你的代码格式正确,这是一个VisualStudio错误。