我关于名称中下划线的问题得到了部分回答here, https://stackoverflow.com/q/12721584/1275653但要么答案不完整,要么我不完全理解。
教派。 C++11 标准的 2.14.8.7 声明了这一点文字运算符举个例子:
long double operator "" _w(long double);
除了声明运算符之外,该标准及其示例还做了另外两件事,如果单独查看,每件事都有意义:
- 它开始于名字
_w
带下划线;和
- 它将运算符放在全局命名空间中。
我的问题有两个部分:
- 根据上面链接的答案, https://stackoverflow.com/q/12721584/1275653名字
_w
不是一个标识符,或标识符_w
不是一个name,或者……好吧,我很困惑。
- If
_w
可以,然后是大写_W
也可以——如60.0_W
, 意义60.0瓦?或者预处理器可能会错误地处理大写版本?
毫无疑问,和你一样,我不习惯用下划线开头全局名称,这是标准派的习惯。 17.6.4.3.2.1 似乎明确弃用。因此,如果您能对下划线、名称和文字运算符的问题提供一些额外的了解,我们将不胜感激。
好的,我向 Clang 团队的 Richard Smith 进行了核实,发现_W
文字运算符中的部分确实不是保留的标识符和/或名称,它也是一个单独的预处理器标记,如果它命名了宏,它将被扩展。这符合标准第 2.5 条,其中标识符 is a 预处理器令牌,以及 2.2,其中宏扩展作为第 4 阶段的一部分,然后预处理器标记被仅替换为语言语法的标记,这发生在第 7 阶段。
他还提到,自委员会波特兰会议以来 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1473, 你可以说operator""_W
,这将防止宏观扩张,因为_W
不再是一个单一的标识符。 Clang trunk 已经实现了这一点并编译了以下代码片段:
#define _W _x
int operator""_W(unsigned long long){ return 42; }
int main(){
int i = 1337_W;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)