В соответствии с проектом стандарта (23.3.6.4 векторные данные), данные() указывают на базовый массив и [data(), data() + size())
должны быть допустимый диапазон:
T* data() noexcept;
const T* data() const noexcept;
1 Returns: A pointer such that [data(),data() + size()) is a valid range. For a non-empty vector,
data() == &front().
2 Complexity: Constant time
Но что, если вектор пуст? Когда я создаю вектор нулевого размера:
#include <vector>
#include <iostream>
int main() {
const int NUM = 0*10;
std::vector< double > v( NUM, 0.0 );
std::cerr << "V : "<< v.data() << std::endl;
}
MSVC 2010 возвращает null, но в Linux (с GCC 4.2.1 и Intel 12.1) я получаю ненулевой адрес.
Может ли vector::data()
разрешить или вернуть значение null? Может ли реализация, например, выполнить первоначальное распределение по умолчанию и вернуть указатель (не нуль)?
Изменить: В нескольких ответах основное внимание уделяется действительности пустого диапазона. Я полностью согласен с этим.
Мне бы очень хотелось увидеть хорошую ссылку или пояснение: разрешено ли ей возвращать null или он может также возвращать непустые?