gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:53:28 24 4
gpt4 key购买 nike

我关于名称中下划线的问题得到了部分回答 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 瓦? 还是预处理器可能错误处理大写版本?

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

最佳答案

好吧,我与 Clang 团队的 Richard Smith 核对过,你的文字运算符中的 _W 部分确实不是保留标识符和/或名称,它也是一个单独的预处理器 token 如果它命名一个宏,将得到扩展。这符合标准子条款 2.5,其中 identifier 是一个 preprocessor-token,而 2.2 在 preprocessor-tokens 之前将宏扩展作为阶段 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;
}

关于c++ - 下划线、名称和文字运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com