Устанавливает ли конструктор по умолчанию std:: pair базовые типы (int, etc) в ноль?



После написания:



std::pair<int, int> x;


Гарантирую ли я, что x.first и x.second равны нулю? Или они могут иметь какую-то ценность?



Причина, по которой я беспокоюсь, заключается в том, что я пытаюсь определить, гарантированно ли карта, значения которой являются указателями, вернет NULL, если я обращусь к элементу, которого нет на карте. То есть, если я сделаю:



std::map<int, void*> my_map;
std::cout << int(my_map[5]) << std::endl;


Тогда я гарантированно получу ноль (NULL)? Или поведение не определено?

503   4  
c++

4 ответов:

Да, эта гарантия остается в силе. Цитируя стандарт C++11, §20.3.2 / 2-3:

constexpr pair();

2 требует: is_default_constructible<first_type>::value Есть true и is_default_constructible<second_type>::value есть true.
3 эффекты: значение-инициализирует first и second.

И §8.5 / 7:

To value-инициализировать объект типа T означает:

  • Если T является (возможно, CV-квалифицированным) типом класса с предоставленным пользователем конструктором, то вызывается конструктор по умолчанию для T (и инициализация неправильно сформирована, если T не имеет доступного конструктора по умолчанию);
  • Если T является (возможно, CV-квалифицированным) несвязным типом класса без предоставленного пользователем конструктора, то объект инициализируется нулем и, если неявно объявленный конструктор по умолчанию T нетривиален, этот конструктор вызывается.
  • Если T является типом массива, то каждый элемент инициализируется значением;
  • в противном случае, объект инициализирован нулем .

И, наконец, §8.5 / 5:

To zero-initialize объект или ссылка типа T означает:

  • если T является скалярным типом, то объекту присваивается значение 0 (ноль), принимаемое за интегральное постоянное выражение, преобразуемое в T;
  • Если T является (возможно, CV-квалифицированным) несвязным типом класса, то каждый нестатический элемент данных и каждый субобъект базового класса являются ноль-инициализировать и обивка инициализируется нулевым значением бита;
  • Если T является (возможно, CV-квалифицированным) типом объединения, Первый нестатический именованный элемент данных объекта инициализируется нулем, а заполнение инициализируется нулевыми битами;
  • Если T является типом массива, то каждый элемент инициализируется нулем;
  • Если T является ссылочным типом, инициализация не выполняется.

Из стандарта C++11, раздел § 20.3.2

constexpr pair();
...
Effects: Value-initializes first and second.
Таким образом, хорошо определено, что инициализация объекта std::pair<int, int> по умолчанию приведет к тому, что оба элемента будут установлены в 0.

Да, они инициализированы нулем. Цитата Бьярне Страуструп "на языке C++ язык программирования" (3-е изд, изм. 17.4.1.7):

Результат m[k] эквивалентен результату (*(m.insert(make_pair(k,V())).first)).second, где V() - значение по умолчанию отображаемого типа. Когда вы понимаете эту эквивалентность, вы, вероятно, понимаете ассоциативные контейнеры.

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

Да, пара конструкторов по умолчанию.

Comments

    Ничего не найдено.