字符串的用户自定义字面量与十六进制值的用户自定义字面量

3

关于这个问题,为什么一个十六进制值的用户定义字面量会映射到与字符串不同的字符串字面量操作符?也就是说,为什么以下代码:

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 是必要的,即使两个字符串都是以 null 结尾?说到这点,为什么 0x551A_hexvec 也被视为一个字符串?为什么不是整数?
1个回答

6
当两个都是空终止字符串时,为什么需要size_t?
在C++中,字符串字面值可以包含空字符 ('\0'),例如 "Nul\0character" 是一个有效的 C++ 字符串字面值。而在进行用户定义字面量(UDL)处理时,C++ 语言希望确保您知道哪些字节实际上是该字符串的一部分。为此,您需要一个大小(size)。
此外,它允许系统区分旨在操作字符串和旨在操作数字的字面值。例如,字面值 21s 可能表示21秒,而字面值 "21"s 可以表示一个包含字符序列 "21" 的 std::string 对象。这两个字面值可以在范围内使用,而不会出现任何交叉影响。
数字字面值 UDL 函数不需要 size_t 来区分自己和用于字符串字面值的重载函数。但是,由于数字字面值不能包含空字符,因此它们没有因未被提供大小而失去太多功能。
至于问题:“实际上,为什么 0x551A_hexvec 要成为一个字符串?难道不应该是整数吗?” 答案是因为这是你要求的结果。
数字字面值的 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,但您可能仍希望将其适应于您正在生成的对象中。因此,您必须能够访问字面值的实际字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接