为什么不使用std::getline就可以调用getline?

Why can I call getline without using std::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。

因为 std::getline() std::string is defined in the header I would have to say that Argument-dependent lookup 开始发挥作用。

当您使用 getline(cin, line) 时,它等同于使用 getline(std::cin, line),因为您有以下行:

using std::cin;

使用参数相关查找 (ADL),编译器能够将该函数调用解析为 std::getline(std::cin, line)。您可以在 http://en.cppreference.com/w/cpp/language/adl.

阅读更多关于 ADL 的信息

这是argument dependent lookup

不合格查找(当您调用 getline() 而不是 std::getline() 时您正在做的事情)将从尝试对 getline 进行正常名称查找开始。它什么也找不到——在该名称的范围内没有变量、函数、类 等。

然后我们将查看每个参数的 "associated namespaces"。在这种情况下,参数是 cinline,它们的类型分别是 std::istreamstd::string,因此它们关联的命名空间都是 std。然后我们在命名空间 std 中重新查找 getline 并找到 std::getline

还有很多细节,我鼓励你阅读我引用的参考资料。此过程也称为 Koenig 查找。