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

13

我正在跟随C++ Primer这本书,并尝试所有的代码示例。 我对这个例子很感兴趣:

#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个回答

21

这是参数依赖查找

未限定的查找(当您只调用 getline() 而不是 std::getline() 时所做的)将尝试执行 getline 的正常名称查找。它会找不到 - 您在范围内没有具有该名称的变量、函数、类等。

然后,我们将在每个参数的“关联命名空间”中查找,对于本例而言,参数分别是cinline,其类型分别为std::istreamstd::string,因此它们的关联命名空间都是std。我们然后在命名空间std中重新查找getline,并找到std::getline

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


这是标准的C++吗? - kalkanistovinko
@kalkanistovinko 是的,没错。 - Barry

7

由于 std::stringstd::getline() 定义在头文件,因此我认为这里涉及到了参数依赖查找


5

当您使用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的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接