c++ - 字符串与十六进制值的用户定义文字

标签 c++ c++11 user-defined-literals

关于 this question , 为什么 a user defined literal对于十六进制值映射到与字符串不同的字符串文字运算符?也就是说,为什么代码

std::vector<uint8_t> val1 = 0x229597354972973aabbe7_hexvec;

映射到

std::vector<uint8_t> operator"" _hexvec(const char*str)
{
    // Handles the form 0xFFaaBB_hexvec and 0Xf_hexvec
    size_t len = strlen(str);
    return convertHexToVec(str, len);   
}

代码

std::vector<uint8_t> val2 = "229597354972973aabbe7"_hexvec;

映射到

std::vector<uint8_t> operator"" _hexvec(const char*str, std::size_t len)
{
    // Handles the conversion form "0xFFAABB"_hexvec or "12441AA"_hexvec
    return convertHexToVec(str, len);
}

size_t 是空终端字符串的必要条件是什么?就此而言,为什么 0x551A_hexvec 根本就是一个字符串?为什么不是整数?

最佳答案

What makes the size_t necessary when both are null terminal strings?

C++ 中并没有规定字符串文字中不能嵌入 NUL 字符。 "Nul\0character" 是有效的 C++ 字符串文字。而在进行 UDL 处理时,C++ 语言希望确保您知道哪些字节实际上是字符串的一部分。为此,您需要一个尺寸。

此外,它还允许系统区分旨在对字符串进行操作的文字和旨在对数字进行操作的文字。文字 21s 可能表示 21 秒,而文字 "21"s 可能表示包含字符串 "21"的 std::string .并且两个文字都可以在范围内而不会发生任何串扰。

数字文字 UDL 函数不采用 size_t 来区别于用于字符串文字的重载。但是,数字字面值不能包含 NUL 字符,因此它们不会因未指定大小而损失太多。

For that matter, why is 0x551A_hexvec a string at all? Why not an integer?

因为那是您要求的。

您的数字文字 UDL 函数可以处理原始文字数据(作为字符串)或合成文字值。如果您使用 UDL 的 const char* 版本,则您要求处理原始文字数据。

合成文字值是使用文字的常规规则从文字计算的 C++ 类型。对于整数数字文字,合成文字值是 unsigned long long:C++ 可用的最大基本整数类型:

std::vector<uint8_t> operator"" _hexvec(unsigned long long value);

当然,unsigned long long有限 大小的事实正是原始文字版本存在的原因。文字 0x229597354972973aabbe7 无法放入 unsigned long long,但您可能仍希望能够将其放入您生成的对象中。因此,您必须能够访问文字值的实际字符。

关于c++ - 字符串与十六进制值的用户定义文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63213192/

相关文章:

c++ - std::priority_queue 中 std::greater 的行为是什么?

c++ - 尝试进入关键部分

c++ - (Windows HID API)HidD_GetPreparsedData() 由于句柄不正确而在 WM_INPUT 消息处理程序中失败?

c++ - 使用alignas 进行参数包扩展的语法是什么?

c++ - 在编译时将 const char* 转换为 const char_type*

C++ - 使用类名作为函数参数

使用运算符 = 时,c++11 unsigned char 变为 int

c++ - 错误到底是什么以及错误地为可 move 和不可复制成员调用复制构造函数有什么解决方法

c++ - 使用用户定义文字的成员时出现编译错误

C++ 11 用户定义文字与 Microsoft Visual Studio 2013