使用字符串作为缓冲容器

时间:2019-03-24 13:52:10

标签: c++ string stdstring

我正在使用从网络作为uint8_t数组接收到的报价消息的库,我可以使用std::string作为这些缓冲区的容器吗?

uint8_t *buffer = ...;
size_t length = ...;

std::string msg = std::string(buffer, length);

此构造函数导致编译错误?如果我使用reinterpret_cast将缓冲区强制转换为char*,它将进行编译,但是定义是否正确且合法?

2 个答案:

答案 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>会更易于使用。