当存在修饰符(L,u8等)时,相邻字符串文字串联会发生什么

时间:2011-03-03 10:20:41

标签: c++ c++11 string-literals

在C和C ++中打破字符串文字是有效的,因为预处理器或编译器会 连接相邻的字符串文字。

const char *zStr = "a" "b"; // valid

当字符串文字以L(宽字符),u(UTF-16),U(UTF-32),u8为前缀时会发生什么(UTF -8)和原始字符串文字(R"foo(this is a "raw string literal" with double quotes)foo")?

例如,允许以下内容:

const wchar_t *zStr = L"a" "b"; // valid?

2 个答案:

答案 0 :(得分:12)

在C ++ 0x中,根据[lex.string] / p13:

,您的示例有效
  

...如果一个字符串文字没有   encoding-prefix,它被视为一个   字符串文字相同   encoding-prefix作为另一个操作数。   ...

在C ++ 03中,同一部分说这段代码有不确定的行为:

  

...如果是一个狭窄的字符串文字标记   与宽字符串文字相邻   令牌,行为未定义。 ...

答案 1 :(得分:4)

是的,C ++ 0x允许该特定示例。前缀和L前缀文字的任何组合都将被视为L-prefixed。

编辑:引文 - N3242(当前C ++ 0x工作草案)§2.14.5/ 13:

  

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