为什么我可以在不使用std :: getline的情况下调用getline?

时间:2015-07-23 21:52:49

标签: c++ namespaces getline

我正在阅读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。

3 个答案:

答案 0 :(得分:15)

这是参数相关查找

&#xA;&#xA;

不合格的查找(当你只是调用 getline()而不是 std :: getline())将首先尝试对 getline 进行正常的名称查找。它什么也没找到 - 你在该名称的范围内没有变量,函数,类等。

&#xA;&#xA;

然后我们将查看每个参数的“关联命名空间”。在这种情况下,参数是 cin line ,它们具有类型 std :: istream std :: string 分别,因此它们的关联命名空间都是 std 。然后,我们在 getline 的命名空间 std 中重做查找,并找到 std :: getline

&#xA;&#xA;

还有更多细节,我建议您阅读我引用的参考资料。此过程另外称为Koenig查找。

&#xA;

答案 1 :(得分:7)

std::getline() is defined in the headerstd::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的更多信息。