包括)"在原始字符串文字中没有终止所述文字

And*_* DM 40 c++ string-literals c++11

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

R"(  
    Some Text)"  
)";       // ^^
Run Code Online (Sandbox Code Playgroud)

如何)"在字符串文字中包含序列而不终止它?

chr*_*ris 66

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

//choose ### as the delimiter so only )###" ends the string
R"###(  
    Some Text)"  
)###";  
Run Code Online (Sandbox Code Playgroud)

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


Che*_*Alf 28

转义不会对你有所帮助,因为这是一个原始的文字,但语法的目的是通过引入一些像任意一样的短语来明确划分开始和结束aha.

R"aha(  
    Some Text)"  
)aha";
Run Code Online (Sandbox Code Playgroud)

顺便说一下,注意)"你的例子相反的顺序和结尾.


关于形式,乍一看(研究标准),似乎转义在原始字符串文字中的作用与普通文字中的作用相同.除了知道它没有,所以当规则中没有注意到异常时,这怎么可能呢?好吧,当在C++ 11中引入原始字符串文字时,它是通过引入额外的撤消翻译阶段,撤消例如转义的效果!

C++11§2.5/ 3

"在原始字符串的初始和最终双引号字符之间,恢复在阶段1和2中执行的任何转换(三字符,通用字符名称和行拼接); 在确定任何d-char,r-char或分隔括号之前,应该应用此反转.

这需要照顾的Unicode字符规格(在通用字符,名称类似\u0042),它们虽然外观和行为像转义正式,在C++中,没有转义序列.

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

" d-char-sequence opt ( r-char-sequence opt ) d-char-sequence opt "

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

"源字符集的任何成员,除了右括号)后跟初始d-char序列 [ 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";
}
Run Code Online (Sandbox Code Playgroud)

输出:

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.