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"
一起使用时但是,如果需要更多的灵活性,可以使用老式的、可转义的字符串文字。为什么标准委员会决定用这些绝对不必要的括号来污染每个原始字符串文字的内容?这背后的理由是什么?我没提到的优点是什么?
克雷克的答案很棒,但不幸的是,这不是一个答案。因为我已经描述过了,所以我理解它是如何工作的,以及它带来了什么好处。从我问这个问题到现在已经过去五年了,仍然没有答案。我仍然对这个决定感到沮丧。有人可能会说这是品味的问题,但我不同意。你使用多少空格,你如何命名你的变量,是 SomeFunction()
还是 some_function()
-这是味道的问题。我可以很容易地从一种风格转换到另一种风格。
But this?.. Still feels awkward and clumsy after so many years. No, this is not about the taste. This is about how we want to cover all possible cases no matter what. We doomed to write these ugly parens every time we need to write a Windows-specific path, or a regular expression, or a multi-line string literal. And for what?.. For those rare cases when we actually need to put "
in a string? I wish I was on that committee meeting where they decided to do it this way. And I would be strongly against this really bad decision. I wish. Now we are doomed.
谢谢你读了这么久,现在我感觉好多了。
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"#"
。
这些提案有什么问题吗?