这是有关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++中潜在的重载或模板函数时,跟踪(编码或其他方式)正在调用哪个函数的正确方法是什么?
最佳答案
equal
在std
命名空间中。您看到的是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/