Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当前缀字符串与非前缀字符串相邻时,字符串文字连接失败?_C++_Visual Studio_C++11 - Fatal编程技术网

C++ 当前缀字符串与非前缀字符串相邻时,字符串文字连接失败?

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!”。 如果两个字符串具有相同的编码前缀(或两者都没有),则生成的字符串将具有相同的编码前缀

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

LPCTSTR str = _T("boo " "hoo");
也就是说:

wchar_t const * str = L"boo " "hoo";
根据(我知道这不是确定的,但这是我目前唯一的参考):

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

有人能确认这是否符合CPPFREFERENCE所示的标准吗

编辑

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

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年的标准,这是一种未定义的行为。