原始字符字面量

5

我不知道是我漏掉了什么,还是它真的不存在。在C++11标准中,添加了原始字符串字面量

string s = "\\w\\\\\\w"; // I hope I got that right
string s = R"(\w\\\w)";  // I'm pretty sure I got that right

我所有尝试使用原始字符字面量的努力都失败了:

constexpr char bslash = R('\'); // error: missing terminating ' character
constexpr char bslash = R'(\)'; // error: 'R' was not declared in this scope

第二次尝试被认为是一个多字符常量!我发现类似于原始字符字面量的使用方式只有这种方法:
constexpr char slash = *R"(\)"; // All Ok.

但是我不喜欢这种表示法(解除引用字符串字面量以存储第一个元素的副本),因为它有点令人困惑。

那么问题是什么?

  • 原始字符字面量存在吗?(我没有找到任何关于它们的信息,所以我几乎可以确定它们不存在)
    • 如果它们存在:我应该如何编写原始字符字面量?
    • 如果它们不存在:为什么?是否有理由添加原始字符串字面量但避免添加原始字符字面量?

4
同样也是很好的理由:char a = '\\'; // 我相当确定我写对了 - Cássio Renan
5
请参阅例如http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2053.html#Raw-character-literals,其中指出“作为一种有意的设计选择,该提案不包括原始字符(而不是字符串)文字,因为似乎没有必要;转义序列在字符文字中并不像在字符串文字中那样造成实际问题。” - dyp
2
@dyp 那是一个答案。 - Shafik Yaghmour
2
@ShafikYaghmour 显然不是,因为这在评论中。 ;) - Yakk - Adam Nevraumont
2
@dyp 我同意ShafikYaghmour的评论,你的评论可以标记为我的问题的答案...实际上它指向了我正在寻找的东西:避免使用原始字符字面量的理由。 - PaperBirdMaster
显示剩余8条评论
1个回答

5
C++11中引入原始字符串字面量的提案,据我所知,是N2442 - 原始和Unicode字符串字面量; 统一提案。它基于Beman DawesN2146 - 原始字符串字面量(修订1),其中包含一个关于原始字符字面量的部分:
作为一种有意的设计选择,没有提出原始字符(而不是字符串)字面值,因为似乎没有必要;转义序列在字符字面值中并不会像在字符串字面值中那样带来实际问题。支持原始字符字面值的论点是对称性和错误减少。知道允许使用原始字符串字面值,程序员可能会认为原始字符字面值也可用。事实上,当委员会成员阅读本文草案时,无意中就做出了这个假设。尽管结果很容易修复,但有人认为最好通过提供原始字符字面值来消除错误的可能性。如果委员会希望添加原始字符字面值,我将很高兴提供建议的措辞。不幸的是,我找不到会议记录中提到任何相关提议的讨论。不过,第一段提到的原因很可能导致了当前的情况。

有趣的是,支持原始字符字面量的一个反驳论点是对称性,这类似于一元操作符+的论点,看起来相当合理。++1 - Shafik Yaghmour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接