Я пытаюсь инициализировать все указатели в векторе до NULL. На основе потока: инициализировать вектор указателей (автоматически) и как инициализировать вектор указателей
Я мог бы просто использовать векторный конструктор для достижения того, чего хочу. Мой вопрос: является ли указатель инициализации NULL стандартным поведением? Или указатели в векторе могут не быть NULL на каком-то компиляторе? Если initialize to NULL является стандартным, может ли кто-нибудь сказать мне, в какой главе и разделе я могу найти соответствующую информацию из c++ стандарта?
Благодаря,
Rong
Я предполагаю, что вы имеете в виду что-то вроде этого:
std::vector<MyClass*> v(10);
Да, вектор инициализируется нулевыми указателями. Цитирование стандартного по главам и стихам несколько влечет за собой...
С++ 14 §23.3.6.2 "векторные конструкторы, копирование и присвоение":
explicit vector(size_type n, const Allocator& = Allocator());
Эффекты: Создает
vector
сn
вставленными по умолчанию элементами с использованием указанного распределителя.Требуется:
T
должен бытьDefaultInsertable
в*this
.
§23.2.1 "Общие требования к контейнерам" ¶13:
-
T
поDefaultInsertable
вX
означает, что следующее выражение хорошо сформировано:allocator_traits<A>::construct(m, p)
- Элемент
X
по умолчанию вставлен, если он инициализируется оценкой выраженияallocator_traits<A>::construct(m, p)
где
p
- адрес неинициализированного хранилища для элемента, выделенного вX
§20.7.8.2 "Функции членов-атрибуторов" ¶5:
template <class T, class... Args> static void construct(Alloc& a, T* p, Args&&... args);
Эффекты: вызывает
a.construct(p, std::forward<Args>(args)...)
если этот вызов хорошо сформирован; в противном случае вызывает::new (static_cast<void*>(p)) T(std::forward<Args>(args)...)
.
§20.7.9.1 "Члены- allocator
[по умолчанию]" ¶12:
template <class U, class... Args> void construct(U* p, Args&&... args);
Эффекты:
::new((void *)p) U(std::forward<Args>(args)...)
Возвращаясь к §23.2.1 ¶13, см., Что args
пуст. Следовательно…
§8.5 "Инициализаторы":
Объектом, инициализатором которого является пустой набор скобок, т.е.
()
, Должен инициализироваться значением.
Тот же раздел:
Для инициализации значения объекта типа
T
означает:... в противном случае объект инициализируется нулем.
Тот же раздел:
Для нулевой инициализации объекта или ссылки типа
T
означает:... еслиT
является скалярным типом (3.9), объект инициализируется значением, полученным путем преобразования целочисленного литерала0
(ноль) вT
; 106
Сноска 106:
Как указано в 4.10, преобразование целочисленного литерала, значение которого равно
0
указывает на нулевой указатель.