当带前缀的字符串与无前缀的字符串相邻时,字符串文本串联失败
String literal concatenation fails when prefixed string is adjacent to non-prefixed string?
在我认为符合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错误。
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)
- 我需要在C++的两个字符串之间找到共同的前缀
- 如果我有很多具有相似前缀的字符串,是否有理由从该前缀创建一个子字符串?
- 提升精神解析字符串以前缀开头
- C 11正则表达式和字符串U8前缀
- 如何实现将前缀与字符串匹配的最快算法
- 为带有带前缀的字符串的容器查找相等的范围
- 使用std :: quare_range查找字符串向量中发生的前缀范围
- 在 Python 中'r'带有字符串的前缀等效C++是多少?
- 创建一个从前缀到C 中字符位置的新字符串
- 字符文字与字符串字面的u前缀有什么区别
- 当带前缀的字符串与无前缀的字符串相邻时,字符串文本串联失败
- 一种在检查十六进制前缀后将字符串转换为int的更干净的方法
- 查找有序STL容器中以前缀开头的所有字符串(非低位ASCII)
- 为包含通用字符名的字符串文字省略u8前缀
- 进行字符串前缀测试的优雅方法
- 如何在boost regex_search中获取原始字符串前缀
- 具有最大长度的字符串前缀同构