2014-09-18 3 views
0

Я пытаюсь инициализировать все указатели в векторе до NULL. Основываясь на резьбе: initialize vector of pointers (automatically) и How to initialize a vector of pointersИнициализировать указатели в векторе

Я мог бы просто использовать векторный конструктор для достижения того, что я хочу. Мой вопрос: является ли указатель инициализации NULL стандартным поведением? Или указатели в векторе могут не быть NULL на каком-то компиляторе? Если инициализация до NULL является стандартной, может ли кто-нибудь сказать мне, в какой главе и разделе я могу найти соответствующую информацию из стандарта C++?

Спасибо,

Rong

ответ

5

Я предполагаю, что вы имеете в виду что-то вроде этого:

std::vector<MyClass*> v(10); 

Да, вектор инициализации с нулевыми указателями. Цитирование стандарта по главе и стихом несколько вовлеченных ...

14 §23.3.6.2 C++ «` вектора конструкторов, копирование и присваивание»:

explicit vector(size_type n, const Allocator& = Allocator());

Эффекты: Формирует a vector с n элементами, вставленными по умолчанию, с использованием указанного распределителя.

Требуется:T должен быть DefaultInsertable в *this. «Общие требования контейнер»

§23.2.1 ¶13:

- T является DefaultInsertable в X означает, что следующее выражение хорошо сформированные:

allocator_traits<A>::construct(m, p) 

- Элемент X: по умолчанию, если он инициализирован оценкой o е выражение

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:

Как указано в 4.10, преобразование целого числа буквальные, значение которого 0 до результатов типа указателя в нулевом значении указателя.

+0

awesome thanks :) – r0ng