Подводные камни взятия адреса элемента std::vector вместо использования data()

У меня есть вектор байтов std::vector<char>. Я хочу передать его данные функции send из Windows Sockets API. Первым пришло в голову сделать так:

std::vector<char> data;
// На этом моменте вектор заполняется данными
send(socket, data.data(), data.size(), 0);

Однако т.к. я использую старый стандарт C++ (Visual studio 2008 SP1), я не могу использовать метод data(), его просто нет. Тогда я прибегаю к этому:

std::vector<char> data;
// На этом моменте вектор заполняется данными
send(socket, &data[0], data.size(), 0);

Я провёл пару "экспериментов", создавая векторы разной длины, заполняя их данными, а потом получая эти данные таким же способом (т.е. исключительно через указатель и его смещения) и никаких ошибок не возникло. На основании этого я предполагаю, что такой способ передачи данных вектора в функцию send возможен и безопасен. Но всё же, на мой взгляд, такой способ выглядит "криво", а всё, что выглядит "криво", по моему опыту таит в себе ряд подводных камней (т.е. возможностей небезопасного поведения программы в какой-либо ситуации).

Отсюда вопрос: безопасно ли передавать данные вектора std::vector<char> data в функцию send таким &data[0] способом и в каких случаях это может привести к чему-то плохому (UB, исключения и т.д.)?

P.S. Прошу не советовать использовать более новый стандарт языка. Это никаким образом не возможно для меня.


Ответы (1 шт):

Автор решения: Harry

Вообще-то да, вроде бы безопасно.

Насколько я помню, даже в старом стандарте было положение, что данные в векторе расположены одним массивом (это не было закреплено de jure в стандарте для string, но de facto работало и там).

Update

Добавляю из комментариев:

  • &data[0] таки UB если size()==0
  • стоит помнить, что изменение размера/емкости вектора может делать указатели на его элементы невалидными
→ Ссылка