626 字
3 分钟
C++用户自定义字面量
2025-03-16

C++11引入了用户自定义字面量(User-Defined Literals)的概念,允许开发者自定义字面量的后缀,以便于创建更直观、更符合特定领域需求的字面量。用户自定义字面量通过在常量后面添加特定的后缀来实现,这些后缀与相应的函数关联,这些函数负责将字面量转换为所需的类型。

用户自定义字面量的基本语法#

用户自定义字面量是通过在标识符后面添加operator""后缀来定义的。例如:

long double operator"" _km(long double val) {
    return val * 1000.0;
}
long double operator"" _m(long double val) {
    return val;
}
long double operator"" _cm(long double val) {
    return val / 100.0;
}

在这个例子中,我们定义了三个用户自定义字面量后缀:_km_m_cm,它们分别用于表示千米、米和厘米。

使用用户自定义字面量#

一旦定义了用户自定义字面量,就可以在代码中直接使用它们:

long double distance = 1.5_km; // 等同于 1500.0
long double length = 100_cm;   // 等同于 1.0

这样,代码的可读性得到了提高,因为字面量直接表达了其物理意义。

用户自定义字面量的类型#

用户自定义字面量可以用于以下类型:

  • 整型字面量:unsigned long long
  • 浮点字面量:long double
  • 字符串字面量:const char*
  • 字符字面量:char
  • C++11中还支持原始字符串字面量:const char* 例如,定义一个用于字符串字面量的自定义后缀:
std::string operator"" _hello(const char* str, size_t len) {
    return std::string(str, len) + " hello";
}
int main() {
    std::string greeting = "World"_hello; // 结果为 "World hello"
    return 0;
}

注意事项#

  1. 用户自定义字面量函数必须是静态成员函数或全局函数。
  2. 字面量运算符函数不能有默认参数。
  3. 字符串字面量运算符函数必须接受两个参数:一个const char*和一个size_t,后者表示字符串的长度。
  4. 用户自定义字面量可以提高代码的可读性和维护性,但应避免过度使用,以免造成混淆。

实际应用#

用户自定义字面量在实际开发中可以用于多种场景,如单位转换、货币转换、字符串处理等。它们使得代码更加直观,减少了转换错误的可能性。

系统自带的字面量#

auto str1 = "hello"_s;
// std::string
auto str2 = "hello";
// const char*
C++用户自定义字面量
http://zaoweiceng.github.io/posts/cpp/字面量/
作者
静惜
发布于
2025-03-16
许可协议
CC BY-NC-SA 4.0