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

Underscores, names and literal operators

本文关键字:文字 运算符 下划线      更新时间:2023-10-16

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

第。C++11标准的2.14.8.7以文字运算符为例:

long double operator "" _w(long double);

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

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

我的问题有两部分:

  1. 根据上面链接的答案,名称_w不是标识符,或标识符_w不是name,or。。。嗯,我很困惑
  2. 如果_w可以,那么大写的_W也可以吗?就像60.0_W一样,意思是60.0瓦或者预处理器可能对大写版本处理不当

毫无疑问,和你一样,我没有用下划线开头全局名称的习惯,这是标准的习惯。17.6.4.3.2.1似乎明确表示反对。因此,如果您能对下划线、名称和文字运算符的问题进行一些补充说明,我们将不胜感激。

好吧,我与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;
}