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

时间:2015-05-18 16:10:47

标签: c++ c++11 string-literals

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

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

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

3 个答案:

答案 0 :(得分:63)

Raw string literals允许您指定几乎任意的*分隔符:

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

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

答案 1 :(得分:26)

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

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

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

关于形式,乍一看(研究标准),似乎转义在原始字符串文字中的作用与普通文字中的作用相同。除了知道它没有,所以当规则中没有注意到异常时,这怎么可能呢?好吧,当在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 < / sub> ) d-char-sequence opt "

其中 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";
}

输出:

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.

答案 2 :(得分:2)

你可以使用,

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

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