Использование строки в качестве контейнера буфера - PullRequest
0 голосов
/ 24 марта 2019

В библиотеке, которую я использую сообщения предложений, полученные из сети в виде массива uint8_t, можно ли использовать std::string в качестве контейнера для этих буферов?

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

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

Этот конструктор вызывает ошибку компиляции? Если я использую reinterpret_cast для приведения буфера к char*, он скомпилируется, но правильно ли это определено и допустимая операция?

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Кроме того, вы можете избежать reinterpret_cast и любых опасений по поводу псевдонимов, если используете *1003* конструктор диапазона (номер 6) :

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

Теперь инициализация зависит исключительно от преобразования unsigned char (потому что давайте посмотрим правде в глаза, это то, что, вероятно, uint8_t) в char. Результат преобразования определяется реализацией, но это не должно удивлять.


В качестве еще одного отступления следует также учитывать, является ли std::string правильной абстракцией здесь. Вы намерены рассматривать буфер как строковый тип? Для последовательности необработанных байтов, без какого-либо строкового багажа, возможно, с std::vector<std::uint8_t> или std::vector<std::byte> может быть проще работать.

2 голосов
/ 24 марта 2019

Вы можете безопасно привести к char*, потому что в стандарте сказано, что char* может иметь псевдоним любого другого типа.

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