C++ 重载字面量运算符 #
背景 #
在群里看见这样一段代码:
里面有一句代码很神奇: 1.0_kmphps
. 0.1_kmphps
的 _kmphps
是一个后缀运算符,
作用是用 0.1 构建一个 kmphps
结构体,
这样在 C++ 里实现一个强类型的单位字面量。然后各个单位之间的转换提前定义了构造函数,在代码里以 static_cast
体现
查阅了一下,这是 C++11 引入的新特性:重载字面运算符常量。
用法 #
类似于 ull
f
这种后缀, 可以实现对字面量的后缀的重载。这种形式的后缀重载可以使用任意标准未规定的后缀,但是不能重载或重定义已经使用的后缀形式,比如前面提到的 ull
f
等后缀。 operator""
支持四种格式的重载:
整型字面量 重载字面量运算符时使用
unsigned long long
、const char *
、或者模板字面量运算符,比如:123m
,1234567890123456789x
。浮点型字面量 重载字面量运算符时使用
long double
、const char *
、或者模板字面量运算符,比如:10.0s
,4567.891234567x
。字符串字面量 重载字面量运算符时使用
(const char*, size_t)
参数,比如:"string"s
,"Foobar"_path
。字符 重载字面量运算符时使用
char
,wchar_t
,char16_t
,char32_t
参数,比如:'f'_runic
,u'BEEF'_w
。
C++ 标准规定保留所有非下划线开头的字面量后缀形式,重载字面量运算符时建议使用下划线开头。 如果使用了非下划线开头的字面量运算符重载形式,在 GCC 编译器中也会有警告信息。
C++11 中提供字面量运算符的重载形式,给字面常量的处理带来很大的便利性和可定制化处理,比如可以在 C++ 中支持任意进制的数据输入、支持大数处理(不用通过先保存为字符串,然后预处理的机制)等。
参考资料 #
- User-defined literals - cppreference https://en.cppreference.com/w/cpp/language/user_literal
- User-Defined-Literal 自定义字面量 https://www.cnblogs.com/tocy/p/cpp11-user-defined-literal.html