在C + + 11的原始string文字R“(…)”括号的基本原理是什么?

在C ++ 11中引入了一个非常方便的function,称为原始string文字,它是不含转义字符的string。 而不是写这个:

regex mask("\\t[0-9]+\\.[0-9]+\\t\\\\SUB"); 

你可以简单的写下这个:

  regex mask(R"(\t[0-9]+\.[0-9]+\t\\SUB)"); 

更可读。 但是,注意在string周围必须放置额外的圆括号来定义原始string文字。

我的问题是,为什么我们甚至需要这些? 对我来说,这看起来相当丑陋,不合逻辑。 以下是我所看到的缺点:

  • 额外的冗长,而整个function是用来使文字更紧凑
  • 很难区分文字的正文和定义的符号

这就是我所说的难以区分的意思:

 "good old usual string literal" ^- body inside quotes -^ R"(new strange raw string literal)" ^- body inside parenthesis -^ 

这里是亲:

  • 更多的灵活性,在原始string中可用的字符更多,特别是当与分隔符一起使用时: "delim( can use () here )delim"

但是,嘿,如果你需要更多的灵活性,你有老好的可逃避的string文字。 为什么标准委员会决定用这些绝对不必要的括号来污染每一个原始string的内容? 那背后的理由是什么? 我没有提到的优点是什么?

括号的目的是让你指定一个自定义分隔符:

 R"foo(Hello World)foo" // the string "Hello World" 

在你的例子中,在典型的使用中,分隔符只是空的,所以原始string被序列R"()"包围。

允许任意分隔符是一个devise决定,它反映了提供完整解决scheme的愿望,而没有奇怪的限制或边缘情况。 您可以selectstring中不会出现的任何字符序列作为分隔符。

如果没有这个,如果string本身包含" (如果你刚刚想要R"..."作为原始string语法)或者)" (如果分隔符是空的) )" ,那么你将会遇到麻烦。 这两个都是非常常见和频繁的字符序列,特别是在正则expression式中,所以如果决定是否使用原始string取决于string的具体内容,那将是令人难以置信的烦人。

请记住,在原始string中没有其他的转义机制,所以最好的办法是连接stringstring,这是非常不切实际的。 通过允许自定义分隔符,所有你需要做的就是select一个不寻常的字符序列一次, 也许修改它在非常罕见的情况下,当你做一个未来的编辑。

但是再次强调一下,即使是空分隔符也是有用的,因为R"(...)"语法允许你在你的string中放置裸引号。 这本身就是一个很大的收获。