Подтвердить что ты не робот

Создает ли стандартный конструктор std:: pair <> базовые типы (int и т.д.) К нулю?

После записи:

std::pair<int, int> x;

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

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

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

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

4b9b3361

Ответ 1

Да, эта гарантия верна. Цитирование стандарта С++ 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:

Для инициализации объекта с типом T означает:

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

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

Для нулевой инициализации объекта или ссылки типа T означает:

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

Ответ 2

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

constexpr pair();
...
Effects: Value-initializes first and second.

Итак, четко определено, что инициализация по умолчанию объекта std::pair<int, int> приведет к тому, что оба элемента будут установлены в 0.

Ответ 3

Да, они инициализируются нулем. Цитата Bjarne Stroustrup "Язык программирования С++" (от немецкого 3-го edn, глава 17.4.1.7):

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

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

Ответ 4

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