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

Std:: map инициализатор списка конструкторов

Стандарт С++ определяет конструктор std::map, используя std::initializer_list:

map( std::initializer_list<value_type> init, const Allocator& );

Однако, где определено, что произойдет, если список инициализаторов содержит повторяющиеся ключи? Выбран первый ключ или последний? Например:

std::map<std::string, int> my_map {
  {"a", 1}, 
  {"a", 2}
};

На практике кажется, что он ведет себя как insert(), так что теперь карта будет содержать {a: 1}.

Однако я не смог найти что-либо в стандарте С++ относительно этого.

4b9b3361

Ответ 1

N4296 (~ С++ 14)

Таблица 102 - Требования к ассоциативным контейнерам

X(il); | То же, что и X(il.begin(), il.end()).

Затем сверху в таблице для итератора ctor:

Эффекты: Создает пустой элементы контейнера и вставок от диапазона [i, j); использует c как объект сравнения.

и

i и j удовлетворяют требованиям ввода итератора и ссылаются на элементы, неявно конвертируемые в value_type, [i,j) обозначает допустимый диапазон,

Обратите внимание, что "и вставляет элементы" здесь не помечены, чтобы указать функцию insert, но я полагаю, что мы можем интерпретировать ее таким образом. Также обратите внимание, что i и j являются итераторами ввода, поэтому их нужно пройти по порядку.

.

(Немного сложнее найти эту информацию, поскольку все эквивалентные таблицы имеют

il обозначает объект типа initializer_list<value_type>

над ними, поэтому можно найти, выполнив поиск initializer_list, но для этой таблицы слово разбивается на две строки с дефисом при разрыве.)