字面量(literal)是指在源代码中写出的固定常量,它们在 C++98 里只能是原生类型,如:
"hello",字符串字面量,类型是 const char[6]
1,整数字面量,类型是 int
0.0,浮点数字面量,类型是 double
3.14f,浮点数字面量,类型是 float
123456789ul,无符号长整数字面量,类型是 unsigned long
C++11 引入了自定义字面量,可以使用 operator"" 后缀 来将用户提供的字面量转换成实际的类型。C++14 则在标准库中加入了不少标准字面量。下面这个程序展示了它们的用法:
#include
#include
#include
#include
#include
using namespace std;
int main()
{
cout << "i * i = " << 1i * 1i<< endl;
cout << "Waiting for 500ms"<< endl;
this_thread::sleep_for(500ms);
cout << "Hello world"s.substr(0, 5)<< endl;
}
输出是:
i * i = (-1,0)
Waiting for 500ms
Hello
上面这个例子展示了 C++ 标准里提供的帮助生成虚数、时间和 basic_string 字面量的后缀。其所在的命名空间是:
std::literals::complex_literals
std::literals::chrono_literals
std::literals::string_literals
要在自己的类里支持字面量也相当容易,唯一的限制是非标准的字面量后缀必须以下划线 _打头。比如,假如我们有下面的长度类:
struct length {
double value;
enum unit {
metre,
kilometre,
millimetre,
centimetre,
inch,
foot,
yard,
mile,
};
static constexpr double factors[] =
{1.0, 1000.0, 1e-3,
1e-2, 0.0254, 0.3048,
0.9144, 1609.344};
explicit length(double v, unit u = metre)
{
value = v * factors[u];
}
};
length operator+(length lhs, length rhs)
{
return length(lhs.value + rhs.value);
}
// 可能有其他运算符
我们可以手写 length(1.0, length::metre) 这样的表达式,但估计大部分开发人员都不愿意这么做吧。反过来,如果我们让开发人员这么写,大家应该还是基本乐意的: 1.0_m + 10.0_cm
。
要允许上面这个表达式,我们只需要提供下面的运算符即可:
length operator"" _m(long double v)
{
return length(v, length::metre);
}
length operator"" _cm(long double v)
{
return length(v, length::centimetre);
}