下划线、名称和文字运算符
Underscores, names and literal operators
我关于名称中下划线的问题在这里得到了部分答案,但要么答案不完整,要么我不完全理解。
第。C++11标准的2.14.8.7以文字运算符为例:
long double operator "" _w(long double);
除了声明操作符之外,标准及其示例还做了两件事,如果分开来看,每件事都有意义:
- 它以下划线作为名称
_w
的开头;以及 - 它将运算符放在全局命名空间中
我的问题有两部分:
- 根据上面链接的答案,名称
_w
不是标识符,或标识符_w
不是name,or。。。嗯,我很困惑 - 如果
_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;
}
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 宏上的用户定义的文字运算符
- Arduino IDE 错误 - 无法找到数字文字运算符"运算符""f900ff"
- 尝试编写进程内存并获取用户定义的文字运算符未找到
- 找不到数字文字运算符“运算符”“+BLA”
- 错误:找不到数字文字运算符"运算符 " " U"?
- Arduino IDE告诉我找不到字符串文字运算符“运算符”“DRIVE”
- 什么是 C++20 的字符串文字运算符模板?
- 下划线、名称和文字运算符
- 在类中定义友元用户定义的文字运算符
- 比较 unicode 和 wchar_t C++:"找不到数字文字运算符"运算符" " F""
- 带字符串文字的前缀与中缀运算符*
- 文字运算符模板在 GCC 4.8 中不起作用