为啥我可以在不使用 std::getline 的情况下调用 getline?
Posted
技术标签:
【中文标题】为啥我可以在不使用 std::getline 的情况下调用 getline?【英文标题】:Why can I call getline without using std::getline?为什么我可以在不使用 std::getline 的情况下调用 getline? 【发布时间】:2015-10-14 10:16:54 【问题描述】:我正在关注 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 版上使用 g++ 版本 4.8.2。
【问题讨论】:
【参考方案1】:这是argument dependent lookup。
不合格的查找(当您调用getline()
而不是std::getline()
时所做的事情)将从尝试对getline
进行正常名称查找开始。它什么也找不到——你在范围内没有具有该名称的变量、函数、类等。
然后我们将查看每个参数的“关联命名空间”。在这种情况下,参数是cin
和line
,它们的类型分别为std::istream
和std::string
,因此它们关联的命名空间都是std
。然后我们在命名空间std
中重新查找getline
并找到std::getline
。
还有更多细节,我鼓励您阅读我引用的参考资料。此过程也称为 Koenig 查找。
【讨论】:
这是标准的 c++ 吗? @kalkanistovinko 是的。【参考方案2】:由于std::getline()
为std::string
is defined in the header 我不得不说Argument-dependent lookup 正在发挥作用。
【讨论】:
【参考方案3】:当你使用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 的更多信息。
【讨论】:
以上是关于为啥我可以在不使用 std::getline 的情况下调用 getline?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 std::getline() 在格式化提取后跳过输入?
为啥 std::getline() 在格式化提取后跳过输入?
为啥 std::getline() 在格式化提取后跳过输入?