Инициализировать указатели в векторе

0

Я пытаюсь инициализировать все указатели в векторе до NULL. На основе потока: инициализировать вектор указателей (автоматически) и как инициализировать вектор указателей

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

Благодаря,

Rong

Теги:
pointers
initialization
vector

1 ответ

6
Лучший ответ

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

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 указывает на нулевой указатель.

  • 0
    офигенно спасибо :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню