在原始字符串文字中包含 )" 而不终止所述文字

Include )" in raw string literal without terminating said literal

两个字符 )" 终止了下面示例中的原始字符串文字。
序列 )" 有时会出现在我的文本中,我希望字符串继续存在,即使在其中找到该序列也是如此。

R"(  
    Some Text)"  
)";       // ^^

如何在不终止的情况下将序列 )" 包含在字符串文字中?

Raw string literals 让您指定一个几乎任意的*分隔符:

//choose ### as the delimiter so only )###" ends the string
R"###(  
    Some Text)"  
)###";  

*确切的规则是:“基本源字符集的任何成员,除了: space,左括号(,右括号),反斜杠\, 和代表水平制表符的控制字符, 垂直制表符、换页符和换行符”(N3936 §2.14.5 [lex.string] 语法)和 "at most 16 characters" (§2.14.5/2)

转义对您没有帮助,因为这是原始文字,但语法旨在通过引入像 aha.

这样的任意短语来明确区分开始和结束
R"aha(  
    Some Text)"  
)aha";

顺便注意最后的 )" 的顺序,与您的示例相反。


关于正式的,乍一看(研究标准)似乎转义在原始字符串文字中的作用与在普通文字中的作用相同。除非有人知道它没有,那么在规则中没有注明例外情况的情况下,这怎么可能呢?好吧,当在 C++11 中引入原始字符串文字时,它是通过引入额外的 undoing 翻译阶段的方式来撤消例如逃跑!,也就是说,...

C++11 §2.5/3

Between the initial and final double quote characters of the raw string, any transformations performed in phases 1 and 2 (trigraphs, universal-character-names, and line splicing) are reverted; this reversion shall apply before any d-char, r-char, or delimiting parenthesis is identified.

这会处理 Unicode 字符规范(通用字符名称,如 \u0042),虽然它们看起来和行为都像转义,但在 C++ 中是正式的, 不是转义序列。

通过对原始字符串文字的内容使用自定义语法规则,可以处理真正的正式转义,或者更确切地说,不处理!也就是说,在 C++ §2.14.5 中 raw-string 文法实体被定义为

" d-char-sequenceopt ( r-char-sequenceopt ) d-char-sequenceopt "

其中 r-char-sequence 定义为 r-char 的序列,其中每个

any member of the source character set, except a right parenthesis ) followed by the initial d-char-sequence [like aha above] (which may be empty) followed by a double quote "


从本质上讲,以上意味着你不仅不能在原始字符串中直接使用转义符(这很重要,它是积极的,而不是消极的),你也不能直接使用 Unicode 字符规范。

以下是间接执行此操作的方法:

#include <iostream>
using namespace std;

auto main() -> int
{
    cout << "Ordinary string with a '\u0042' character.\n";
    cout << R"(Raw string without a '\u0042' character, and no \n either.)" "\n";
    cout << R"(Raw string without a '\u0042' character, i.e. no ')" "\u0042" R"(' character.)" "\n";
}

输出:

Ordinary string with a 'B' character.
Raw string without a '\u0042' character, and no \n either.
Raw string without a '\u0042' character, i.e. no 'B' character.

你可以使用,

R"aaa(  
    Some Text)"  
)aaa"; 

此处 aaa 将是您的字符串分隔符。