为什么不使用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 的信息
不合格查找(当您调用 getline()
而不是 std::getline()
时您正在做的事情)将从尝试对 getline
进行正常名称查找开始。它什么也找不到——在该名称的范围内没有变量、函数、类 等。
然后我们将查看每个参数的 "associated namespaces"。在这种情况下,参数是 cin
和 line
,它们的类型分别是 std::istream
和 std::string
,因此它们关联的命名空间都是 std
。然后我们在命名空间 std
中重新查找 getline
并找到 std::getline
。
还有很多细节,我鼓励你阅读我引用的参考资料。此过程也称为 Koenig 查找。
我正在阅读 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.
不合格查找(当您调用 getline()
而不是 std::getline()
时您正在做的事情)将从尝试对 getline
进行正常名称查找开始。它什么也找不到——在该名称的范围内没有变量、函数、类 等。
然后我们将查看每个参数的 "associated namespaces"。在这种情况下,参数是 cin
和 line
,它们的类型分别是 std::istream
和 std::string
,因此它们关联的命名空间都是 std
。然后我们在命名空间 std
中重新查找 getline
并找到 std::getline
。
还有很多细节,我鼓励你阅读我引用的参考资料。此过程也称为 Koenig 查找。