我正在查看用户定义的文字的cppreference页面,我想除了几个例子我理解了所有内容
templatedouble operator "" _?(); // OK
这个操作符如何工作?你怎么称呼它?
double operator"" _Z(long double); // error: all names that begin with underscore // followed by uppercase letter are reserved double operator""_Z(long double); // OK: even though _Z is reserved ""_Z is allowed
上述两个功能有什么区别?如果第一个函数不是错误,那么调用第一个函数而不是第二个函数会有什么不同?
谢谢!
templatedouble operator "" _?(); // OK 这个操作符如何工作?你怎么称呼它?
1.234_?
会打电话operator "" _?<'1', '.', '2', '3', '4'>()
.此表单允许您检测通常无法检测到的拼写差异(例如,1.2
vs 1.20
),并允许您避免因为1.2
甚至无法完全表示而导致的舍入问题long double
.
double operator"" _Z(long double); // error: all names that begin with underscore // followed by uppercase letter are reserved double operator""_Z(long double); // OK: even though _Z is reserved ""_Z is allowed上述两个功能有什么区别?
C++标准根据标记定义语法,您可以将其解释为单词."" _Z
是两个令牌,""
和_Z
.""_Z
是一个单一的标记.
这种区别很重要:给定#define S " world!"
,然后"Hello" S
,空格是S
独立标记的原因,防止它被视为用户定义的文字后缀.
为了更容易编码,在定义这些函数时通常允许使用"" _Z
和""_Z
语法,但"" _Z
语法需要_Z
被视为标识符.当实现预定义_Z
为宏或将其声明为自定义关键字时,这可能会导致问题.