字面量_用户定义字面量

本文介绍 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;

用户定义字面量

通过定义用户定义的后缀,允许整数、浮点数、字符及字符串字面量产生用户定义类型的对象。

针对上面时间的例子,使用用户自定义字面量,可以如下实现:

03fd16edbd76e58fcbf9f5638158bd75.png

以“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

最后四个对于字符串很有用,因为第二个参数会自动推断为字符串的长度,例如:

f4263543e0854a4eaa3a44d6906a6aa4.png

字面量的返回值并没有被严格限定,可以提供相容类型的返回值,例如:

f16048a4153a8629eb3184c010a4e666.png

由于最大吞噬规则,以e和E结束的用户定义整数和浮点字面量,其后随运算符+或-时,必须以空白符或括号与运算符分隔,例如:

ab6cb6d063d1f0777b36c177d522fbac.png b9dfa86e045502a8ed40844bd8dd70fa.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值