C++11引入了一种非常方便的特性,称为原始字符串字面量,它们是没有转义字符的字符串。而不是写成这样:
regex mask("\\t[0-9]+\\.[0-9]+\\t\\\\SUB");
您只需简单地写下这段代码:
regex mask(R"(\t[0-9]+\.[0-9]+\t\\SUB)");
非常易读。然而,请注意在定义原始字符串字面值时需要放置额外的括号。
我的问题是,为什么我们需要这些呢?对我来说,它看起来很丑陋和不合逻辑。以下是我所看到的缺点:
- 额外冗长,而整个功能的用途是使文字更紧凑
- 很难区分文字的主体和定义符号
这就是我所说的难以区分 :
"good old usual string literal"
^- body inside quotes -^
R"(new strange raw string literal)"
^- body inside parenthesis -^
以下是优点:
- 更灵活,原始字符串中有更多可用字符,特别是在使用分隔符时:
"delim( can use "()" here )delim"
但是,如果您需要更多的灵活性,可以使用旧的转义字符串。为什么标准委员会决定用这些绝对不必要的括号污染每个原始字符串文字的内容?背后的理论是什么?我没有提到的优点是什么?
UPD Kerrek的答案很好,但很遗憾,这不是一个答案。因为我已经描述了我理解它如何工作以及它带来的好处。自从我问这个问题以来已经过去了五年,仍然没有答案。我对这个决定感到沮丧。有人可能会说这是品味问题,但我不同意。你使用多少空格,如何命名你的变量,这是SomeFunction()
还是some_function()
- 这是品味问题。我可以很容易地从一种风格切换到另一种风格。
但是这个?..这么多年过去了,仍然感觉笨拙和笨重。不,这不是关于品味的问题。这是关于我们想要涵盖所有可能情况的方式,无论如何。我们注定要每次需要编写特定于Windows的路径、正则表达式或多行字符串文字时都写入这些丑陋的括号。为什么?..为了那些我们实际上需要在字符串中放置"
的罕见情况吗?我希望我能参加委员会会议,他们决定以这种方式做。我会强烈反对这个非常糟糕的决定。我希望。现在我们注定了。
感谢您阅读到这里。现在我感觉好多了。
UPD2 这是我的替代提案,我认为这两个提案都比现有的好得多。
提案1. 受Python启发。不支持三重引号的字符串字面量:R"""这是一个字符串文字,其中包含任何内容,除了你不经常使用的三重引号。"""
提案2. 受常识启发。支持所有可能的字符串字面量,就像当前的一样:R"delim"content of string"delim"
。空分隔符:R""看起来更好,不是吗?""
。空原始字符串:R""""
。带双引号的原始字符串:R"#"这里有双引号:"", 谢谢"#"
。
这些提案有什么问题吗?
R";-](R"(this is a basic raw string literal as text inside a more complex one)");-]"
的翻译是:R";-](R"(这是一个基本的原始字符串字面量,作为更复杂字符串中的文本部分)");-]"
。 - oblitum"
的情况很少,这可能是问题的一部分。问题不在于没有答案。有一个答案,只是您不同意它。如果您对“答案”的定义是“让我改变对此的看法的东西”,那么您的问题就过于主观了。已经提供了解释;不需要得到您的同意。 - Nicol Bolas