本文介绍 C++11起的用户自定义字面量新特性。
字面量
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数、浮点数以及字符串;而有很多也对布尔类型和字符类型的值也支持字面量表示;还有一些甚至对枚举类型的元素以及像数组、记录和对象等复合类型的值也支持字面量表示法。
C++自带4种字面量:
①整形 123
②浮点型 12.3
③字符 '1'
④字符串 "123"
其中,整形字面量后可以加后缀来修饰当前字面量的类型:
※无符号整形(unsigned int): 123U或123u
※长整形(long): 123L或123l
常用举例:
const unsigned int time = 123; //time为常量,123为字面量
string str =“hello world”; // str 为变量,hello world为字面量
那么问题来了,time的单位是什么呢?秒、毫秒、微秒?假如我们能编写下面这样代码,就能解决此问题,用户定义字面量正是如此:
unsigned long long time = 123_s;
unsigned long long total_time = 123_s+456_ms;
用户定义字面量
通过定义用户定义的后缀,允许整数、浮点数、字符及字符串字面量产生用户定义类型的对象。
针对上面时间的例子,使用用户自定义字面量,可以如下实现:
以“unsigned long long time = 123_s;”为例,当编译器遇到一个带有_s的用户定义字面量时,它进行无限定名字查找,寻找名为 operator "" _s的函数。寻找过程如下:
(1)若重载集包含带有形参类型 unsigned long long 的字面量运算符,则用户定义字面量表达式被当做函数调用operator "" _s(123)
(2)否则,若重载集包含原始字面量运算符,则用户定义字面量表达式被当做函数调用operator "" _s("123")
(3)否则,若重载集包含数值字面量运算符模板,则用户定义字面量表达式被当做函数调用operator "" _s()
字面量运算符
用户定义字面量所调用的函数被称为字面量运算符(或若它是模板,则被称为字面量运算符模板)。此函数的名称形式有如下两种:
※operator "" 标识符:用户定义字面量所用的标识符,必须以下划线_开始,可选的以空格分割(标识符与""之间)(注:标准库的字面量标识符不以下划线开始。);
※operator""关键字:注意""后不带空格,使用此形式不改变用户定义字面量必须以下划线开始的规则。
字面量的参数
C++11允许用户自定义字面量,但只允许字面量后缀函数的参数为以下类型:
※char const *
※unsigned long long
※long double
※char const *, size_t
※wchar_t const *, size_t
※char16_t const *, size_t
※char32_t const *, size_t
最后四个对于字符串很有用,因为第二个参数会自动推断为字符串的长度,例如:
字面量的返回值并没有被严格限定,可以提供相容类型的返回值,例如:
由于最大吞噬规则,以e和E结束的用户定义整数和浮点字面量,其后随运算符+或-时,必须以空白符或括号与运算符分隔,例如: