【发布时间】:2013-10-05 05:46:43
【问题描述】:
在 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"#"。
这些建议有什么问题吗?
【问题讨论】:
-
R";-](R"(this is a basic raw string literal as text inside a more complex one)");-]" -
语法确实很丑 imo,但我真的想不出一个既能保持向后兼容又能保持所有功能的替代方案。
-
@ChilliDoughnuts,请参阅更新后的问题。
-
@Mikhail: "对于那些我们实际上需要将 " 放入字符串中的罕见情况?" 事实上,您认为需要
"的情况原始字符串“稀有”可能是问题的一部分。并不是说“没有答案”。有一个答案;你只是不同意它。如果你对什么构成的定义“答案”是“说服我改变主意的东西”,那么你的问题太自以为是了。已经提供了理由;不需要你同意。 -
您不应更新历史上被高度评价的问题以包含一个新问题……而是发布一个新问题。 (无论如何,这可能会因基于意见而被关闭,因为您唯一的反对意见似乎是“我觉得这不美观”)
标签: c++ c++11 standards string-literals