在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中放置裸引号。 这本身就是一个很大的收获。