这是有关C++中默认全局 namespace 的问题。我有以下使用g++ clang-500.2.79编译并正常运行的代码。

#include <string>
#include <iostream>

using std::string;
using std::endl;
using std::cout;

bool is_palindrome(const string& str){
    return equal(str.begin(), str.end(), str.rbegin());
}

int main(){

    cout << "Hello is a palindrome: " << is_palindrome("Hello") << endl;
    cout << "madam is a palindrome: " << is_palindrome("madam") << endl;

    return 0;
}

我的问题是,为什么此代码可以正确编译?我忘记将#include <algorithm>using std::equal放在文件的开头。因此,预期的行为是编译器抱怨的。

http://en.cppreference.com/w/cpp/algorithm/equal上的示例确认我应该使用std::equal

为了对此进行进一步调查,我试图精确地跟踪正在调用哪个版本的equal()函数。作为C++的相对新手,我也不知道该怎么做。我试过了,
cout << "The function is: " << equal << endl;

生成了带有一些有趣信息的编译器错误:
/usr/include/c++/4.2.1/bits/stl_algobase.h:771:5:
note: 'std::equal' declared here

尽我所能,我找不到有关STL_algobase的信息(或更可能是,我很可能不了解所发现的信息)。 stl_algobase是一组自动包含在全局 namespace 中的函数吗?

另一个问题是:在处理C++中潜在的重载或模板函数时,跟踪(编码或其他方式)正在调用哪个函数的正确方法是什么?

最佳答案

equalstd命名空间中。您看到的是argument dependent lookup(ADL)。因为参数在std中,所以equal的名称查找也会考虑该 namespace 。

这是一个简化的示例:

namespace foo
{
  struct Bar {};
}

namespace foo
{
  void bar(const Bar&) {}
  void bar(int) {}
}

int main()
{
  foo::Bar b;
  foo::bar(b);  // OK
  bar(b);       // ADL, OK
  foo::bar(42); // OK
  bar(42);      // No ADL: error: 'bar' was not declared in this scope
}

关于c++ - 默认情况下是否在全局 namespace 中包含equal()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22114947/

10-11 23:03