它在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?
在C ++ 0x中,根据[lex.string] / p13,您的示例有效:
...如果一个字符串文字没有
encoding-prefix,它被视为一个
字符串文字相同
encoding-prefix作为另一个操作数。
...
在C ++ 03中,同一部分表示此代码具有未定义的行为:
...如果是一个窄字符串文字标记
与宽字符串文字相邻
令牌,行为未定义。 ...
在C ++ 0x中,根据[lex.string] / p13,您的示例有效:
...如果一个字符串文字没有
encoding-prefix,它被视为一个
字符串文字相同
encoding-prefix作为另一个操作数。
...
在C ++ 03中,同一部分表示此代码具有未定义的行为:
...如果是一个窄字符串文字标记
与宽字符串文字相邻
令牌,行为未定义。 ...
是的,C ++ 0x允许该特定示例。前缀和L前缀文字的任何组合都将被视为所有都是L前缀的。
编辑:引文 - N3242(当前C ++ 0x工作草案)§2.14.5/ 13:
在翻译阶段6(2.2)中,连接相邻的字符串文字。如果两个字符串文字具有相同的encoding-prefix,则生成的连接字符串文字具有该encoding-prefix。如果一个字符串文字没有编码前缀,则将其视为与另一个操作数相同的编码前缀的字符串文字。