3

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

教派。C++11 标准的 2.14.8.7 声明了这个文字运算符作为示例:

long double operator "" _w(long double);

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

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

我的问题有两个部分:

  1. 根据上面链接的答案,名称_w不是标识符,或者标识符_w不是名称,或者......好吧,我很困惑。
  2. 如果没问题_w,那么大写的_W也可以 - 如60.0_W,意思是60.0 瓦? 还是预处理器可能会错误处理大写版本?

毫无疑问,我和你一样,不习惯用下划线开始全局名称,这是标准教派的习惯。17.6.4.3.2.1 似乎明确弃用。因此,如果您可以对下划线、名称和文字运算符的问题进行一些额外的说明,那么您将不胜感激。

4

1 回答 1

10

好的,我与 Clang 团队的 Richard Smith 进行了核对,_W您的文字运算符中的部分确实不是保留的标识符和/或名称,它也是一个单独的预处理器令牌,如果它命名一个宏,它将被扩展。这与标准子条款 2.5 一致,其中标识符preprocessor-token,并且 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;
}
于 2012-12-10T05:33:12.120 回答