跳转至

字面量

1 自定义字面量

  • 功能:通过定义用户定义的后缀,允许整数、浮点数、字符及字符串字面量产生用户定义类型的对象。
  • 语法规则:通过重载字面量运算符""供用户定义字面量调用
  • 返回值类型 operator "" 标识符(参数):
    • 其中标识符与""由空白符分割
    • 标识符以下划线_开头且后随非大写字母
  • 返回值类型 operator ""标识符(参数)
    • 标识符与""之间不用空白符分隔
    • 标识符以下划线_开头
  • 注意:对标识符的限制只是为了避免与系统保留标识符冲突,实际并不会触发编译错误。
  • 参数
  • 参数限制
    • ( const char * ) (1)
    • ( unsigned long long int ) (2)
    • ( long double ) (3)
    • ( char ) (4)
    • ( wchar_t ) (5)
    • ( char8_t ) (6) (C++20 起)
    • ( char16_t ) (7)
    • ( char32_t ) (8)
    • ( const char * , std::size_t ) (9)
    • ( const wchar_t * , std::size_t ) (10)
    • ( const char8_t * , std::size_t ) (11) (C++20 起)
    • ( const char16_t * , std::size_t ) (12)
    • ( const char32_t * , std::size_t ) (13)
  • 参数说明
    • (1) 拥有此形参列表的字面量运算符是原始字面量运算符,用于整数和浮点用户定义字面量的后备方式(见上文)
    • (2) 拥有这些形参列表的字面量运算符是用户定义整数字面量的首选字面量运算符
    • (3) 拥有这些形参列表的字面量运算符是用于定义浮点字面量的首选字面量运算符
    • (4-8) 拥有这些形参列表的字面量运算符由用户定义的字符字面量所调用
    • (9-13) 拥有这些形参列表的字面量运算符由用户定义的字符串字面量所调用
  • 返回值:返回值类型没有任何限制,也可以是void类型
  • 示例
long double operator "" _w(long double ld) { 
  return ld; 
};
float operator "" _w(const char* c) {
    return atof(c);
};
int main() {
    1.2_w; // 调用运算符 "" _w(1.2L)
    12_w; // 调用运算符 "" _w("12")
}

2 标准库字面量

标准库中定义了下列字面量运算符: - 定义于内联命名空间 std::literals::complex_literals | 定义| 功能 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | operator ""if(C++14) | 表示纯虚数的 std::complex 字面量 (函数) | | operator ""i | 表示纯虚数的 std:: complex 字面量 (函数) | | operator ""il | 表示纯虚数的 std:: complex 字面量 (函数) | - 定义于内联命名空间 std::literals::chrono_literals

定义 功能
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 字面量 (函数)
  • 定义于内联命名空间 std::literals::string_literals | 定义| 功能 | |---|---| | operator""s(C++14) | 转换字符数组字面量为 basic_string (函数) |
  • 定义于内联命名空间 std::literals::string_view_literals |定义 | 功能 | |---|---| | operator""sv(C++17) | 创建一个字符数组字面量的字符串视图 (函数) |

2.1 operator""s转换字符数组字面量为basic_string

  • 功能:即c风格字符串转c++字符串
  • 源码
// basic_string LITERALS
inline namespace literals {
    inline namespace string_literals {
        _NODISCARD inline string operator"" s(const char* _Str, size_t _Len) {
            return string(_Str, _Len);
        }

        _NODISCARD inline wstring operator"" s(const wchar_t* _Str, size_t _Len) {
            return wstring(_Str, _Len);
        }

#ifdef __cpp_char8_t
        _NODISCARD inline basic_string<char8_t> operator"" s(const char8_t* _Str, size_t _Len) {
            return basic_string<char8_t>(_Str, _Len);
        }
#endif // __cpp_char8_t

        _NODISCARD inline u16string operator"" s(const char16_t* _Str, size_t _Len) {
            return u16string(_Str, _Len);
        }

        _NODISCARD inline u32string operator"" s(const char32_t* _Str, size_t _Len) {
            return u32string(_Str, _Len);
        }
    } // namespace string_literals
} // namespace literals
  • 示例
#include <iostream>
#include <vector>
int main() {
    const char* c = "123";
    using namespace std::string_literals;
    std::string s = "123"s;
}

2.2 operator ""sv 创建一个字符数组字面量的字符串视图

  • 功能:即c风格字符串转c++字符串视图string_view
  • 源码:类似operator""s的实现
  • 示例
#include <iostream>
#include <vector>
#include <string_view>
int main() {
    using namespace std::string_literals;
    using namespace std::string_view_literals;
    const char* c = "123";
    std::string s = "123"s;
    std::string_view sv = "123"sv;
}