C++标准是否保证将"a" "b"合并成"ab"?

3
以下代码是否符合C++标准?我之前看到过并且它运行良好。然而,我不确定它是否已经成为标准。
#include <iostream>

int main(){
    const char str[] = "a" "b";
    std::cout << str << std::endl;
    return 0;
}

C++标准要求实现时将相邻的字符串字面量合并为一个。如果实现声称符合标准,则必须提供保证。实现中的错误或缺陷可能会影响此功能。 - Peter
1个回答

5
预处理器 在一步中 合并相邻的字符串字面量。如果分隔字符串字面量的唯一内容是空白字符,则它们将合并为一个组合的字符串字面量。
完整过程在[lex.string]/7中描述。

在第6个翻译阶段([lex.phases]),相邻的字符串字面量将被串联起来。如果两个字符串字面量具有相同的编码前缀,则结果串联的字符串字面量具有该编码前缀。如果一个字符串字面量没有编码前缀,则将其视为与另一个操作数具有相同编码前缀的字符串字面量。如果UTF-8字符串字面量标记相邻于宽字符串字面量标记,程序是不正确的。任何其他连接都是有条件支持的,并带有实现定义的行为。

[注意3:此串联是一种解释,而不是一种转换。因为解释发生在第6个翻译阶段(在字符串字面量内容已经使用字符串字面量的关联字符编码进行编码之后),所以字符串字面量的初始原始性对串联的解释或良好格式的影响不大。— 结束语]

Table 13 has some examples of valid concatenations.
source     means  source     means  source     means
------------------------------------------------------
|u"a" u"b" u"ab" | U"a" U"b" U"ab" | L"a" L"b" L"ab" |
|u"a"  "b" u"ab" | U"a"  "b" U"ab" | L"a"  "b" L"ab" |
| "a" u"b" u"ab" | "a"  U"b" U"ab" | "a"  L"b" L"ab" |
------------------------------------------------------
在连接字符串时,字符保持不同。 [例2: “\xA” “B” 在连接后包含两个字符'\xA'和'B'(而不是单个十六进制字符'\xAB')。— 结束例子]

这也适用于变量吗?例如:const char a = "a";const char str[] = a "b"; - TheEagle
char a = "a" "b"; 无法编译,因为字符串字面量是 const char[N] 类型,而不是 char 类型。 - NathanOliver
这是一个打字错误,谢谢! - TheEagle
@frederic 这不适用于变量。它只适用于字符串字面值。 - NathanOliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接