【发布时间】:2019-10-25 09:43:27
【问题描述】:
我试图向一些同事总结std::find 的工作原理,我想向他们展示在std::map 上使用它是多么棘手(以及为什么他们不应该),所以我开始摆弄编译器探险家。
我想我遇到了libc++ 和libstdc++ 之间的实现差异,因为下面的 sn-p 在前者上编译
#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.
所以我很困惑,我想知道这两者中的哪一个是理想的行为。编译器资源管理器链接:
- 使用 libc++ https://godbolt.org/z/KDsMsC
- 带有 libstdc++ https://godbolt.org/z/g3DqlJ
【问题讨论】:
-
你必须包含标题
,那么问题是什么? -
@VladfromMoscow 我想唯一的问题是编译器错误似乎表明参数不匹配“无法将'istreambuf_iterator'与'_Rb_tree_iterator'匹配”
-
@SPD 编译器明确表示找不到名称 std::find。
-
@VladfromMoscow 我知道。我只是在说明模板错误经常令人困惑的事实,这是一个很好的例子。在这种情况下,编译器最好只抑制“无法匹配'istreambuf_iterator' ...”这一行——这会更直观,而且我们很可能根本不会花时间在这篇文章上。
-
@SPD 起初编译器没有找到该函数。找到函数后,编译器可以判断其参数是否有效。
标签: c++ c++11 libstdc++ libc++