Reference:
1. 字面量
在C++中,字面量(Literal)
是表示固定值的语法元素。它们是程序中的常量值,直接出现在代码中,不需要进行计算或求值。C++支持多种类型的字面量,包括整数、浮点数、字符、字符串和布尔值。
下面是几种常见的C++字面量类型:
- 整数字面量(Integer Literals):用于表示整数值。可以使用十进制、八进制、十六进制或二进制表示法。例如:
42
,0xFF
,0755
,0b1010
; - 浮点数字面量(Floating-point Literals):用于表示浮点数值。可以使用十进制或科学计数法表示法。例如:
3.14
,2.0e-5
; - 字符字面量(Character Literals):用于表示单个字符值。使用单引号括起来。例如:
A
,x
,\n
。 - 字符串字面量(String Literals):用于表示字符串值。使用双引号括起来。例如:
Hello, World!
,OpenAI
,42
; - 布尔字面量(Boolean Literals):用于表示布尔值,即
true
或false
; - 空指针字面量(Null Pointer Literals):用于表示空指针值。使用关键字
nullptr
表示。
这些字面量可以直接在代码中使用,并具有与其类型相对应的值和语义。它们提供了一种直观和方便的方式来表示常量值,并在编程中广泛使用。
2. 字面量运算符
C++11 提供了一种创建用户自定义字面量的机制:字面量运算符(User-defined Literal Operator)
。
概念:
- 形如
T operator"" name(T1, T2)
,其中 name 是用户自定义的后缀,例如unsigned int operator“” _t(const char*s, size_t l)
,用的话这样使用"123"_t
。一般建议后缀开头是下划线。如果不加下划线也能使用,但是会报以下Warning:
2. 字面量重载运算符可以把字面值常量(注意只能是字面值常量,也就是“123”,123,1.23,‘a’这样,不能是变量),转化为需要的类型对象。
3. 使用要点
根据字面值类型的不同,操作符函数可以接受的参数也是不一样的。
- 字面值是整数:操作符只能接受
unsigned long long
作为参数; - 字面量为浮点数:操作符函数只可接受
long double
为参数; - 字面量为字符串:操作符函数只可接受
const char*
、size_t
为参数; - 字面量为字符:则操作符函数只接受一个
char
为参数。
4. 示例
1. 字面值是整数
int operator"" _n(unsigned long long i){
return i / 10;
}
void test_n(){
int a = -21474836470_n;
cout << a << endl;
}
这样不会出现溢出。
2. 字面量为浮点数
double operator"" _f(long double i){
return i / 10;
}
void test_f(){
double a = -214748.36470_f;
cout << a << endl;
}
3. 字面量为字符串
unsigned int operator"" _s(const char*s, size_t l){
cout << "s = " << s << endl << "l = " << l << endl;
return l;
}
void test_s(){
unsigned int a = "12346"_s;
cout << a << endl;
}
4. 字面量为字符
int operator"" _c(char c){
return c;
}
void test_c(){
cout << 'a'_c << ", " << 'A'_c << endl;
}
5. 比较好用的一个场景
inline std::chrono::microseconds operator"" _us(unsigned long long time_) { return std::chrono::microseconds(time_); }
---
std::this_thread::sleep_for(5000_us);
在/usr/include/c++/9/chrono里面就是这样写的,写法如下:
template <char... _Digits>
constexpr chrono::microseconds
operator""us()
{ return __check_overflow<chrono::microseconds, _Digits...>(); }