boost::asio различные read и write функции и методы принимают boost::asio::buffer. Согласно буферная документация, изменяемый std::string не может быть заключен в boost::asio::buffer и поэтому не может использоваться для asio read. Вероятно, это связано с тем, что std::string не позволяет изменять доступ к внутреннему буферу (это обсуждалось ранее здесь).
Это позор, потому что std::string - удобный способ представления изменяемых буферов данных в С++. Без него мы либо остаемся с массивами POD, boost::array и std::vector<char>. Первые два неудобны для сообщений переменной длины. std::vector<char> может работать, но это неестественный способ переноса буферов данных вокруг (*)
Вопросы:
- Существуют ли другие альтернативы
std::stringсboost::asioдля чтения буферов? Я что-то пропустил здесь? - Интересно, почему
std::vector<char>поддерживается в изменяемом буфере. Это потому, что он гарантирует, что его внутренний буфер смежен в памяти и позволяет изменять его доступ с помощью&vec[0]?
Заранее спасибо
(*) ИМХО. Например, посмотрите на сериализацию protobuf - он предлагает сериализацию в std::string, но не в std::vector<char>, по крайней мере, неявно.
EDIT: В конце концов я использовал vector<char>. protobuf разрешает сериализацию в vector<char> посредством вызова SerializeToArray, который принимает указатель (&vec[0] может быть передан там).