我正在阅读C ++入门手册并尝试所有代码示例。 我很喜欢这个:
#include <iostream>
#include <string>
using std::string;
using std::cin;
using std::cout;
using std::endl;
int main()
{
string line;
while (getline(cin,line))
cout << line << endl;
return 0;
}
在编译此代码之前,我猜测编译会失败,因为我没有使用
while (std::getline(cin,line))
为什么getline在全局命名空间中? 据我了解,这应该只在我使用
时才会发生namespace std;
或
using std::getline;
我在Linux Mint Debian Edition上使用g ++版本4.8.2。
答案 0 :(得分:15)
这是参数相关查找。
&#xA;&#xA;不合格的查找(当你只是调用 getline()
而不是 std :: getline()
)将首先尝试对 getline
进行正常的名称查找。它什么也没找到 - 你在该名称的范围内没有变量,函数,类等。
然后我们将查看每个参数的“关联命名空间”。在这种情况下,参数是 cin
和 line
,它们具有类型 std :: istream
和 std :: string
分别,因此它们的关联命名空间都是 std
。然后,我们在 getline
的命名空间 std
中重做查找,并找到 std :: getline
。
还有更多细节,我建议您阅读我引用的参考资料。此过程另外称为Koenig查找。
&#xA;答案 1 :(得分:7)
自std::getline()
is defined in the header的std::string
后,我不得不说Argument-dependent lookup正在发挥作用。
答案 2 :(得分:5)
当您使用getline(cin, line)
时,它等同于使用getline(std::cin, line)
,因为您有以下行:
using std::cin;
使用Argument Dependent Lookup(ADL),编译器能够解析对std::getline(std::cin, line)
的函数调用。您可以在http://en.cppreference.com/w/cpp/language/adl了解有关ADL的更多信息。