【问题标题】:User Defined Literals for a String versus for a Hex Value字符串与十六进制值的用户定义文字
【发布时间】:2020-11-22 13:28:07
【问题描述】:

关于this question,为什么十六进制值的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 根本是一个字符串?为什么不是整数?

【问题讨论】:

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


    【解决方案1】:

    当两者都是空终端字符串时,为什么需要 size_t?

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

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

    数字文字 UDL 函数不采用 size_t 来将自己与用于字符串文字的重载区分开来。但是,数字字面量不能包含 NUL 字符,因此它们不会因为没有指定大小而损失太多。

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

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 2016-04-22
      • 2017-12-02
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2018-01-22
      • 2014-03-07
      • 1970-01-01
      相关资源
      最近更新 更多