Устанавливает ли конструктор по умолчанию 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)? Или поведение не определено?
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