Mik*_*ail 68 c++ standards string-literals c++11
C++ 11中引入了一个非常方便的特性,称为原始字符串文字,它是没有转义字符的字符串.而不是写这个:
regex mask("\\t[0-9]+\\.[0-9]+\\t\\\\SUB");
Run Code Online (Sandbox Code Playgroud)
你可以简单地写一下:
regex mask(R"(\t[0-9]+\.[0-9]+\t\\SUB)");
Run Code Online (Sandbox Code Playgroud)
更具可读性.但是,请注意字符串周围的额外括号,以定义原始字符串文字.
我的问题是,为什么我们甚至需要这些呢?对我来说,它看起来很丑陋和不合逻辑.以下是我看到的缺点:
这就是我所说的难以区分的意思:
"good old usual string literal"
^- body inside quotes -^
R"(new strange raw string literal)"
^- body inside parenthesis -^
Run Code Online (Sandbox Code Playgroud)
以下是专业人士:
"delim( can use "()" here )delim"但是,嘿,如果你需要更多的灵活性,你有旧的好逃脱字符串文字.为什么标准委员会决定用这些绝对不必要的括号来污染每个原始字符串文字的内容?那背后的理由是什么?我没有提到的专业是什么?
UPD Kerrek的答案很棒,但不幸的是,这不是一个答案.因为我已经描述过我理解它是如何工作的,它给了什么好处.自从我提出这个问题五年过去了,仍然没有答案.我仍然对这个决定感到沮丧.可以说这是一个品味问题,但我不同意.你使用了多少个空格,你如何命名你的变量,是这个SomeFunction()还是some_function()- 这是品味问题.而且我可以轻松地从一种风格切换到另一种风格.
但是这个?经过这么多年后仍然感到尴尬和笨拙.不,这不是味道.这是关于我们如何想要涵盖所有可能的情况,无论如何.每当我们需要编写特定于Windows的路径,或正则表达式或多行字符串文字时,我们注定要编写这些丑陋的parens.为了什么?..对于那些我们实际需要放入"字符串的罕见情况?我希望我参加委员会会议,他们决定这样做.我强烈反对这个非常糟糕的决定.我希望.现在我们注定了.
感谢您阅读此内容.现在我觉得好一点.
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"#".
这些建议有什么问题吗?
Ker*_* SB 97
括号的目的是允许您指定自定义分隔符:
R"foo(Hello World)foo" // the string "Hello World"
Run Code Online (Sandbox Code Playgroud)
在你的榜样,并在典型应用中,分隔符是干脆为空,所以原始字符串是由序列封闭R"(和)".
允许任意分隔符是一种设计决策,它反映了在没有奇怪限制或边缘情况的情况下提供完整解决方案的愿望.您可以选择字符串中未出现的任何字符序列作为分隔符.
Without this, you would be in trouble if the string itself contained something like " (if you had just wanted R"..." as your raw string syntax) or )" (if the delimiter is empty). Both of those are perfectly common and frequent character sequences, especially in regular expressions, so it would be incredibly annoying if the decision whether or not you use a raw string depended on the specific content of your string.
Remember that inside the raw string there's no other escape mechanism, so the best you could do otherwise was to concatenate pieces of string literal, which would be very impractical. By allowing a custom delimiter, all you need to do is pick an unusual character sequence once, and maybe modify it in very rare cases when you make a future edit.
但是再次强调,即使空分隔符已经很有用,因为R"(...)"语法允许您在字符串中放置裸引号.这本身就是一个收获.
由于对方的回答解释说,必须有引号额外的东西,以避免在案件的分析歧义地方"或)",或实际可能出现的字符串本身在任何关闭程序.
至于语法选择,嗯,我同意语法选择不是 最理想的,但一般来说它是可以的(你可以想到它:"事情可能更糟",哈哈).我认为这是使用简单性和解析简单性之间的良好折衷.
建议1.灵感来自python.不能支持带有三引号的字符串文字:
R"""任何内容,除了三重引号,您实际上并不经常使用它们."""
确实有一个问题 - "引用,你实际上并没有经常使用".首先,原始字符串的想法是表示原始字符串,即与文本文件中出现的字符串完全相同,无需对字符串进行任何修改,无论字符串内容如何.其次,语法应该是通用的,即不添加像"几乎原始字符串"等变体.
你会如何用这种语法写一个引用?两个引号?注意 - 这些是非常常见的情况,特别是当您的代码处理字符串和解析时.
建议2.
R"delim"字符串"delim"的内容.
R""看起来更好,不是吗?"".
R"#"这里是双引号:"",谢谢"#".
嗯,这个可能是一个更好的候选人.但有一件事 - 一个常见的情况(我认为这是接受语法的一个激励案例),双引号字符本身很常见,原始字符串应该派上用场.
所以,让我们看看,正常的字符串语法:
s1 = "\"";
s2 = "\"quoted string\"";
Run Code Online (Sandbox Code Playgroud)
你的语法例如用"x"作为delim:
s1 = R"x"""x";
s2 = R"x""quoted string""x";
Run Code Online (Sandbox Code Playgroud)
接受的语法:
s1 = R"(")";
s2 = R"("quoted string")";
Run Code Online (Sandbox Code Playgroud)
是的,我同意括号引入一些烦人的视觉效果.因此,我怀疑语法的作者是否认为在这种情况下很少需要额外的"delim",因为)"在字符串中不常出现.但OTOH,拖尾/领先/孤立的报价也相当频繁,所以如你提出的语法(#2)将需要一些delim更多的时候,这反过来将需要更经常地对其进行更改R""..""到R"delim"..."delim".希望你明白这个主意.
语法可以更好吗?我个人更喜欢更简单的语法变体:
Rdelim"string contents"delim;
Run Code Online (Sandbox Code Playgroud)
通过以上示例:
s1 = Rx"""x;
s2 = Rx""quoted string""x;
Run Code Online (Sandbox Code Playgroud)
但是为了正常工作(如果它在当前语法中可能的话),这个变体将需要限制部件的字符集delim,比如仅限于字母/数字(因为现有的运算符),并且可能对初始字符的某些进一步限制避免与未来可能的语法发生冲突.
所以,我认为更好的选择可能已经作出,虽然没有什么显著可以更好地在这种情况下进行.
| 归档时间: |
|
| 查看次数: |
22320 次 |
| 最近记录: |