【问题标题】:STL algorithm function name resolutionSTL算法函数名解析
【发布时间】:2011-08-28 16:25:58
【问题描述】:

我希望在下面的示例中编译器将无法编译代码,因为它 不知道什么是“find()”,它定义在 algorithm 标头中的 std 命名空间中。

但是,此代码在 RHEL 5.3 上使用 gcc 4.1.2 编译。

我错过了什么?

#include <string>    
#include <algorithm>

int main()
{
    std::string s;
    find(s.begin(), s.end(), 'a');  // should not compile
}

【问题讨论】:

标签: c++ stl namespaces


【解决方案1】:

这是由于参数依赖查找而起作用的。在参数类型的命名空间中搜索函数模板。在本例中,参数为std::string::iterator,因此在命名空间std 中搜索该函数。

【讨论】:

  • +1 — ADL 在某些情况下开始变得更有意义:例如,可以使用 ADL 来扩展 boost::hash_value。
  • Aka Koenig 查找。 dimba:如果你想向自己证明这一点,你可以看到::find 不会在全局命名空间中找到匹配项,而给定char a[1]find(&amp;a[0], &amp;a[0], 'a') 将找不到std::find() template....
  • 只是为了详细说明为什么 ADL 存在,ADL 的“主要”理由是让操作员自然地工作。给定两个std::string 对象s1s2,您希望能够将它们与s1 + s2 连接起来。如果没有 ADL,你必须写 std::operator+(s1, s2)。但事实证明,对于其他情况,它也是一种非常有用的机制
  • here 显示了如何使用 ADL 自定义标准库的另一个很好的示例。
  • @jalf:这个例子真的好吗?据我所知(今晚不远 - 必须在凌晨 4 点之前停止玩愚蠢的游戏),无论如何都可以匹配全局 ::operator+(const std::string&amp;, const std::string&amp;)。因此,更多的是找到正确的find(),尽管在与调用代码关联的干预命名空间中存在其他不相关的find()......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2018-09-18
相关资源
最近更新 更多