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"""Here is a string literal with any content, except for triple quotes, which you don't actually use that often."""
建议 2. 受常识启发。支持所有可能的字符串文字,就像当前的:R"delim"content of string"delim"
. 带空分隔符:R""Looks better, doesn't it?""
. 空的原始字符串:R""""
. 带双引号的原始字符串:R"#"Here are double quotes: "", thanks"#"
.
这些建议有什么问题吗?