C++ 当前缀字符串与非前缀字符串相邻时,字符串文字连接失败?
在我认为符合C++11的MSVS2013中,编译器不喜欢以下内容:C++ 当前缀字符串与非前缀字符串相邻时,字符串文字连接失败?,c++,visual-studio,c++11,C++,Visual Studio,C++11,在我认为符合C++11的MSVS2013中,编译器不喜欢以下内容: LPCTSTR str = _T("boo " "hoo"); 也就是说: wchar_t const * str = L"boo " "hoo"; 根据(我知道这不是确定的,但这是我目前唯一的参考): 并排放置的字符串文本在编译过程中连接在一起。也就是说,“Hello”,“world!”生成(单个)字符串“Hello,world!”。 如果两个字符串具有相同的编码前缀(或两者都没有),则生成的字符串将具有相同的编码前缀
LPCTSTR str = _T("boo " "hoo");
也就是说:
wchar_t const * str = L"boo " "hoo";
根据(我知道这不是确定的,但这是我目前唯一的参考):
- 并排放置的字符串文本在编译过程中连接在一起。也就是说,“Hello”,“world!”生成(单个)字符串“Hello,world!”。
- 如果两个字符串具有相同的编码前缀(或两者都没有),则生成的字符串将具有相同的编码前缀(或没有前缀)
- 如果其中一个字符串具有编码前缀,而另一个没有,则不具有编码前缀的字符串将被视为具有与另一个相同的编码前缀。
- 如果UTF-8字符串文字和宽字符串文字并排,则程序的格式不正确
- 实现可能支持也可能不支持编码前缀的任何其他组合。这种连接的结果由实现定义
error C2308: concatenating mismatched strings
2003 ISO C++标准,第2.134P3部分表示:
在翻译阶段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的一个缺陷。FWIW,该错误的原因是不允许连接宽字符串和非宽字符串文字。这看起来像是一个尚未实现的C++11特性。您应该在Microsoft Connect上提交错误报告。MSVS2013是否声称(完全)支持C++2011?当然要报告它,但不清楚它是否真的是一个bug。@KeithThompson,从我收集的信息来看,他们仍在向C++11和C++14发展,尽管没有任何信息表明这是否在要做的事情列表中。这两个答案都很好。我之所以给你,是因为你的发帖速度快了一分钟。:)@阿德里安:我还提到,根据2003年的标准,这是一种未定义的行为。