insert_or_assign разрешает итератор - PullRequest
0 голосов
/ 06 июня 2018

У меня есть этот кусок кода:

auto it = my_map.lower_bound(my_key);

Следующий вывод дает мне ошибку:

static_assert(std::is_same<decltype(it), std::map<K, V>::const_iterator>::value, "Error");

И следующий, все в порядке:

static_assert(std::is_same<decltype(it), std::map<K, V>::iterator>::value, "Error");

Тогда компилятор не дает мне const_iterator.Хорошо.Но здесь:

my_map.insert_or_assign(it, my_key, some_val);

даже при iterator (не const_iterator) функция работает.Но в этой ссылке в insert_or_assign сигнатурах у меня есть только const_iterator аргументы.Я также искал файл .h в Visual Studio, и эта информация совпадает.Протестировано на GCC 7.2+ и Visual Studio 2015, все компилируется и запускается.

Почему компилируется?Почему insert_or_assign принимает iterator?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Ваш lower_bound вызов даст вам неконстантный итератор на неконстантной карте.Однако существует автоматическое преобразование неконстантного итератора в const-итератор, поэтому любую функцию, для которой требуется const_iterator, можно вызывать с неконстантным итератором того же типа.

0 голосов
/ 06 июня 2018

Все контейнеры должны иметь тип iterator, который можно преобразовать в const_iterator.См. Требования к контейнеру Таблица

X​::​iterator должна быть любой категорией итератора, которая отвечает требованиям прямого итератора. конвертируется в X::const_iterator.

Таким образом, const_iterator создается из iterator, возвращаемого lower_bound при вызове insert_or_assign.

...