下划线,名称和文字运算符

时间:2012-12-10 01:58:27

标签: c++ c++11 operator-overloading

关于姓名中下划线的问题部分得到了解答here,,但要么答案不完整,要么我不完全理解。

派。 C ++ 11标准的2.14.8.7声明此文字运算符为例:

long double operator "" _w(long double);

除了声明操作符之外,标准及其示例还做了两件事,如果单独查看,每件事都有意义:

  • 它以下划线开头名称_w;和
  • 它将运算符放在全局命名空间中。

我的问题分为两部分:

  1. 根据the answer linked above,,名称_w不是标识符,或标识符_w不是名称,或......好吧,我很困惑。
  2. 如果_w没问题,那么大写的_W也可以 - 就像在60.0_W中一样,意味着 60.0瓦?或者预处理器很可能错误处理大写版本?
  3. 毫无疑问,和你一样,我不习惯用下划线开始全球名字,习惯是标准的教派。 17.6.4.3.2.1显然似乎弃用了。因此,如果您可以在下划线,名称和文字操作符的问题上投射一些额外的亮点,那么光将会受到赞赏。

1 个答案:

答案 0 :(得分:10)

好吧,我和Clang团队的Richard Smith一起回来了,你的文字运算符中的_W部分确实不是保留的标识符和/或名称,它也是一个单独的预处理器令牌,它将被扩展如果它命名一个宏。这符合标准的子条款2.5,其中标识符预处理器 - 令牌,而2.2在预处理器令牌之前具有宏扩展作为阶段4的一部分。取而代之的只是语言语法的标记,这发生在第7阶段。

他还提到,since the Portland meeting of the committee,您可以说operator""_W,这会阻止宏扩展,因为_W不再是单个标识符。 Clang trunk已实现此功能并编译以下代码段:

#define _W _x

int operator""_W(unsigned long long){ return 42; }

int main(){
  int i = 1337_W;
}