50

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

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

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

4

3 回答 3

82

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

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

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

于 2015-05-18T16:15:42.923 回答
31

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

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

顺便注意一下和最后的顺序)"与你的例子相反。


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

C++11 §2.5/3

在原始字符串的初始和最终双引号字符之间,在阶段 1 和 2 中执行的任何转换(三元组、通用字符名称和行拼接)都将被还原;在识别任何d-charr-char或定界括号之前,此还原应适用。

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

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

" d-char-sequence选择 ( r-char-sequence选择 ) d-char-sequence选择 "

其中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' 字符。
于 2015-05-18T16:17:18.277 回答
3

您可以使用,

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

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

于 2015-05-18T16:38:12.863 回答