我正在使用从网络作为uint8_t
数组接收到的报价消息的库,我可以使用std::string
作为这些缓冲区的容器吗?
uint8_t *buffer = ...;
size_t length = ...;
std::string msg = std::string(buffer, length);
此构造函数导致编译错误?如果我使用reinterpret_cast
将缓冲区强制转换为char*
,它将进行编译,但是定义是否正确且合法?
答案 0 :(得分:2)
您可以安全地强制转换为char*
,因为标准规定char*
可以别名任何其他类型。
// this would be fine
std::string msg(reinterpret_cast<char*>(buffer), length);
答案 1 :(得分:2)
顺便说一句,如果您使用reinterpret_cast
的{{3}},则可以避免std::string
和任何有关别名的疑虑:
std::string msg(buffer, buffer + length);
现在,初始化工作完全依赖于将unsigned char
的转换(因为我们要面对的是uint8_t
可能就是)转换为char
。转换结果是实现定义的,但并不奇怪。
除此以外,这里还应该考虑std::string
是否是正确的抽象。您是否打算将缓冲区视为字符串类型?对于一系列原始字节,没有任何字符串负担,也许std::vector<std::uint8_t>
或std::vector<std::byte>
会更易于使用。