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



在下面的例子中,两个字符)"终止了原始字符串文字。
序列)"可能在某些时候出现在我的文本中,我希望字符串继续,即使在其中找到该序列。

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

我怎么能包括序列)"在字符串字面而不终止它?

原始字符串文字允许您指定几乎任意的*分隔符:

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

*确切的规则是:"基本源字符集的任何成员,除了:空格,左括号(,右括号),反斜杠,以及表示水平制表符的控制字符,垂直制表符、表单进给和换行符"(N3936§2.14.5)。字符串]语法)和"最多16个字符"(§2.14.5/2)

转义对您没有帮助,因为这是一个原始文字,但是通过引入像aha这样的一点任意短语,语法被设计为允许清晰地划分开始和结束。

R"aha(  
    Some Text)"  
)aha";

顺便说一下,注意)"在末尾的顺序,与您的示例相反。


关于形式,乍一看(研究标准),似乎转义在原始字符串字面值中的工作与在普通字面值中的工作相同。除非人们知道它不存在,所以当规则中没有例外情况时,这怎么可能呢?当c++ 11中引入原始字符串字面量时,它是通过引入额外的撤销翻译阶段来撤销例如转义的效果!& help;

C + + 11§2.5/3

”字符、r字符或分隔括号之前标识

这处理Unicode字符规范(通用字符名称,如u0042),尽管它们看起来和行为像转义,但在c++中,它们不是转义序列。

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

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

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

源字符集的任何成员,除了右括号)后跟初始的d-char-sequence[像上面的aha](可以是空的)后面跟着双引号"


从本质上讲,上面的意思是你不仅不能直接在原始字符串中使用转义(这是很重要的,它是积极的,而不是消极的),你也不能直接使用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";
}
输出:

<>之前带有'B'字符的普通字符串。没有'u0042'字符的原始字符串,也没有n。没有'u0042'字符的原始字符串,即没有'B'字符。

你可以使用

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

这里aaa将是您的字符串分隔符。

最新更新