Я читал FAQ на isocpp.org по адресу "Ссылка здесь" и наткнулся на предостережение, что с std::vector
std::vector<int> v;
auto a = &v[0]; // Is undefined behaviour but
auto a = v.data(); // Is safe
От фактического сайта:
void g()
{
std::vector<Foo> v;
// ...
f(v.begin(), v.size()); // Error, not guaranteed to be the same as &v[0]
↑↑↑↑↑↑↑↑↑ // Cough, choke, gag; use v.data() instead
}
Кроме того, использование
&v[0]- это поведение undefined, еслиstd::vectorилиstd::arrayпуст, в то время как безопасно использовать.data()функция.
Я не уверен, что понял это точно. ::data() возвращает указатель на начало массива, а &[0] возвращает адрес начала. Я не вижу здесь разницы, и я не думаю, что &[0] разыскивает что-либо (т.е. Не читает память у элемента 0). В Visual Studio в отладочной сборке доступ к индексу [0] приводит к сбою утверждения, но в режиме выпуска он ничего не говорит. Также адреса в обоих случаях равны 0 для построенного по умолчанию вектора.
Также я не понимаю, что комментарий о ::begin() не гарантированно совпадает с ::operator[0]. Я предположил, что для вектора необработанный указатель в итераторе begin(), ::data() и &[0] был одинаковым значением.