C++11 用户定义字面量
C++11 用户定义字面量
C++11引入了一项功能,称为用户自定义字面量(user-defined literals),它允许程序员定义自己的字面量后缀,以扩展现有的字面量语法。
内置字面量
C++ 自带4种字面量:
- 整形
123
- 浮点型
12.3
- 字符
'1'
- 字符串
"123"
字面量又可添加后缀来表明具体类型,建议大写:
- 无符号整形(
unsigned int
):123U
- 长整形(
long
):123L
标准库定义了一些字面量后缀:
字面量后缀运算符 | 含义 |
---|---|
operator""if operator""i operator""il(C++14) |
表示纯虚数的 std::complex 字面量 (函数) |
operator""h(C++14) | 表示小时的 std::chrono::duration 字面量 (函数) |
operator""min(C++14) | 表示分钟的 std::chrono::duration 字面量 (函数) |
operator""s(C++14) | 表示秒的 std::chrono::duration 字面量 (函数) |
operator""ms(C++14) | 表示毫秒的 std::chrono::duration 字面量 (函数) |
operator""us(C++14) | 表示微秒的 std::chrono::duration 字面量 (函数) |
operator""ns(C++14) | 表示纳秒的 std::chrono::duration 字面量 (函数) |
operator""y(C++20) | 表示特定年的 std::chrono::year 字面量 (函数) |
operator""d(C++20) | 表示月内日期的 std::chrono::day 字面量 (函数) |
operator""s(C++14) | 转换字符数组字面量为 basic_string (函数) |
operator""sv(C++17) | 创建一个字符数组字面量的字符串视图 |
用户定义字面量
用户定义字面量(UDL)允许程序员在代码中定义自己的字面量,这些字面量的类型可以是任何用户定义的类型。
为了定义一个用户自定义字面量,必须定义一个名为operator ""
的函数,后面紧跟着一个下划线和字面量后缀。使用时在字面量后加上这个下划线后缀即可。
注意:
- 区别于标准库定义的字面量后缀运算符是不带下划线的
operator""X
,而用户定义字面量后缀运算符是带下划线的operator""_X
。 - 可以加上
constexpr
来避免函数调用 - C++11 只允许字面量后缀函数的参数为以下类型,即整数,浮点以及字符串,而返回值则无类型限制:
unsigned long long
long double
char const*
char const*, std::size_t
wchar_t const*, std::size_t
char16_t const*, std::size_t
char32_t const*, std::size_t
long double constexpr operator""_cm(long double x) {
return x * 10;
}
int operator"" _bin(const char *s, size_t l) {
int ret = 0;
for (int i = 0; i < l; i++) {
ret = (ret << 1) | (s[i] - '0');
}
return ret;
}
int main() {
int num = "110"_bin; // 6
int mm = 12.3_cm; // 123
}