关于 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/