Я пытаюсь подвести итог некоторым коллегам, как работает std::find
, и я хотел показать им, как сложно использовать его на std::map
(и почему они не должны), поэтому я начал возиться с компиляторомexplorer.
Я думаю, что я столкнулся с несоответствием реализации между libc++
и libstdc++
, поскольку следующий фрагмент компилируется на первом
#include <string>
#include <map>
int main (){
std::map<std::string, int> myMap;
myMap["string1"] = 100;
std::map<std::string, int>::value_type element("string1", 100);
auto it = std::find(myMap.begin(), myMap.end(), element);
}
, но не компилируется с последним генерирующимследующая ошибка
error: no matching function for call to 'find'
auto it = std::find(myMap.begin(), myMap.end(), element);
^~~~~~~~~
/opt/compiler-explorer/gcc-9.2.0/lib/gcc/x86_64-linux-gnu/9.2.0/../../../../include/c++/9.2.0/bits/streambuf_iterator.h:373:5: note: candidate template ignored: could not match 'istreambuf_iterator' against '_Rb_tree_iterator'
find(istreambuf_iterator<_CharT> __first,
^
1 error generated.
Так что я озадачен, и мне интересно, какое из двух является желаемым поведением. Ссылки компилятора: