使用string作为缓冲容器

问题描述 投票:0回答:2

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

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

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

这个构造函数导致编译错误?如果我使用reinterpret_cast将缓冲区转换为char*,它将编译,但它是否定义良好且合法运行?

c++ string stdstring
2个回答
2
投票

您可以安全地投射到char*,因为标准说char*可以别名任何其他类型。

// this would be fine
std::string msg(reinterpret_cast<char*>(buffer), length);

2
投票

顺便说一句,如果你使用reinterpret_caststd::string,你可以避免使用range constructor (number 6)以及对别名的任何疑虑:

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

现在,初始化完全取决于将unsigned char转换为uint8_t(因为让我们面对它,这就是char可能是这样)。转换结果是实现定义的,但不应该令人惊讶。


另外,还应该考虑std::string是否是正确的抽象。您打算将缓冲区视为字符串类型吗?对于一系列原始字节,没有任何字符串包袱,也许std::vector<std::uint8_t>std::vector<std::byte>可以更容易使用。

© www.soinside.com 2019 - 2024. All rights reserved.