Я читал 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]
был одинаковым значением.