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

thb*_*thb 3 c++ operator-overloading c++11

关于名字中的下划线的问题在这里得到了部分回答,但要么答案不完整,要么我不完全理解.

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

long double operator "" _w(long double);
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题有两个部分:

  1. 根据上面链接的答案,名称_w不是标识符,或者标识符_w不是名称,或者......好吧,我很困惑.
  2. 如果_w可以,那么大写也_W没关系 - 就像在60.0_W,意味着60.0瓦? 或者预处理器是否可能错误处理大写版本?

毫无疑问,和你一样,我不习惯用下划线开始全球名字,这是习惯的标准.17.6.4.3.2.1显然似乎弃用了.因此,如果您可以在下划线,名称和文字操作符的问题上投射一些额外的亮点,那么光将会受到赞赏.

Xeo*_*Xeo 10

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

他还提到,自从委员会的波特兰会议,你可以说operator""_W,这将阻止宏观扩张,因为它_W不再是一个单一的标识符.Clang trunk已实现此功能并编译以下代码段:

#define _W _x

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

int main(){
  int i = 1337_W;
}
Run Code Online (Sandbox Code Playgroud)

  • @ K-ballo:请记住,问题不在于对用户定义的文字使用文字的ooerator,而是替换`_W`的声明. (2认同)