2016-10-18 2 views
3

Я делал простую картографическую программу, но в итоге был задан этот вопрос. В документе C++ сказано следующее:std :: map :: operator []

Элемент доступа Если k соответствует ключу элемента в контейнере, функция возвращает ссылку на его отображаемое значение. Если k не соответствует ключу любого элемента в контейнере, функция вставляет новый элемент с этим ключом и возвращает ссылку на его отображаемое значение. Обратите внимание, что это всегда увеличивает размер контейнера на единицу, даже если для элемента не назначено сопоставленное значение (элемент создается с использованием его конструктора по умолчанию).

Часть, которую я действительно не вижу, это то, где она говорит: «элемент is constructerd использует свой конструктор по умолчанию».

Я дал ему попробовать и сделал это

std::map<string, int> m; 
m["toast"]; 

Я просто хотел, чтобы увидеть, какое значение будет отображенный элемент «тост» быть. И это оказалось нулевым, но почему? имеют ли примитивные типы конструктор по умолчанию? или что происходит?

+0

Что это за «документ C++»? Не похоже, что это очень точно. –

+0

(Элемент карты * инициализирован значением *.) –

+0

@KerrekSB, который я должен использовать? Я просто использую cplusplus.com, я делаю неправильно? – Darwin57721

ответ

4

Заявление "используя конструктор по умолчанию" сбивает с толку. Точнее, для std::map::operator[], если ключ не существует, вставленное значение будет value-initialized.

Если используется распределитель по умолчанию, это приведет к тому, что ключ будет выполнен из ключа, а отображаемое значение будет value-initialized.

int, это означает zero-initialization.

4) В противном случае объект инициализируется нулем.

+0

спасибо! Думаю, я буду использовать cppreference вместо cplusplus. – Darwin57721

+2

@ Darwin57721 Конечно, вам нужно. :) – songyuanyao

1

значения Карта являются значение инициализирован по operator[], который для int означает нуль-инициализации.

В соответствии с определением стандарта (§23.4.4.3):

Эффекты: Если нет ключа эквивалентно х в карте, вставляет value_type(x, T()) в карту.

T() объясняется как (§8.5/10):

Объект, инициализатор представляет собой пустое множество скобок, т.е. (), должна быть инициализирована значением

, что означает (§8.5/8):

К v ALUE инициализировать объект типа T означает:

[...]

- в противном случае, объект равен нулю инициализирован.

и нулевой инициализации определяется как (§8.5/6):

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

- если Т представляет собой скалярного типа, объект устанавливается на значение 0 (ноль), принято как интегральное постоянное выражение, преобразованное в T

[...]

все цитаты взяты из n4140

Смежные вопросы