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)");-]"