为什么在尾部反斜杠之前解析原始字符串文字



从翻译阶段来看,反斜线连接下一行发生在第2阶段,字符串文字求值发生在第3阶段。那么,为什么下面的代码以前会进行字符串求值呢?

#include<string>
#include<iostream>
int main() {
std::string s = R"(before
after)";
std::cout << s;
}

给出:

before
after

而不是:

beforeafter

第2阶段

  1. 每当反斜杠出现在一行的末尾(紧接着是零个或多个空白字符,而不是换行符后面跟着换行符(因为C++23((,这些字符就会被删除,将两个物理源行合并为一个逻辑源行。[…]

第3阶段

  1. 源文件被分解为注释、空白字符序列(空格、水平制表符、新行、垂直制表符和表单提要(和预处理标记,它们如下:a( 诸如或";myfile.h";b( 标识符c( 预处理数字d( 字符和字符串文字,包括用户定义的(自C++11以来([…]

原始字符串文本显式撤消阶段1&2:

如果下一个字符开始一个可能是原始字符串文字的前缀和初始双引号的字符序列;,下一个预处理标记应该是原始字符串文字。在原始字符串的首个和最后一个双引号字符之间,在第1和第2阶段执行的任何转换(通用字符名和行拼接(都将被恢复;此反转应在识别任何d-char、r-char或定界括号之前适用。

最新更新