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

User Defined Literals for a String versus for a Hex Value

关于 , why does a 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[=11=]character" 是有效的 C++ 字符串文字。而在进行 UDL 处理时,C++ 语言希望确保您知道哪些字节实际上是字符串的一部分。为此,您需要一个尺码。

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

数字文字 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,但您可能仍希望能够将其放入您正在生成的对象中。因此,您必须能够访问文字值的实际字符。