在我认为符合C ++ 11标准的MSVS2013中,编译器不喜欢以下内容:
LPCTSTR str = _T("boo " "hoo");
转换为:
wchar_t const * str = L"boo " "hoo";
根据cppreference.com(我知道这不是确定的,但它是我目前唯一的参考):
重点是我自己。
任何人都可以确认这是否符合cppreference指示的标准?
修改
由于不喜欢,我的意思是我得到以下错误:
error C2308: concatenating mismatched strings
答案 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错误。