2015-07-23 18 views
5

Sto seguendo il libro di C++ Primer e provando tutti gli esempi di codice. Mi intriga questo:Perché posso chiamare getline senza usare std :: getline?

#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; 
} 

Prima di compilare questo codice stavo indovinando che la compilazione avrebbe fallito, dal momento che non sto usando

while (std::getline(cin,line)) 

Perché getline nel namespace globale? quanto ho capito, questo dovrebbe accadere solo se ho usato

namespace std; 

o

using std::getline; 

Sto usando g ++ versione 4.8.2 su Linux Mint Debian Edition.

risposta

12

Questo è argument dependent lookup.

ricerca non qualificato (cosa si sta facendo quando si basta chiamare getline() invece di std::getline()) inizierà cercando di fare nome normale ricerca per getline. Non troverà nulla - non hai variabili, funzioni, classi, ecc. Nell'ambito di questo nome.

Analizzeremo quindi gli "spazi dei nomi associati" di ciascuno degli argomenti. In questo caso, gli argomenti sono cin e line, che hanno rispettivamente i tipi std::istream e std::string, quindi i rispettivi spazi dei nomi associati sono entrambi std. Abbiamo quindi ripetere la ricerca all'interno dello spazio dei nomi std per getline e trovare std::getline.

Ci sono molti altri dettagli, vi incoraggio a leggere il riferimento che ho citato. Questo processo è noto anche come ricerca di Koenig.

+0

Questo standard C++? – kalkanistovinko

+0

@kalkanistovinko Sì, lo è. – Barry

5

Quando si utilizza getline(cin, line), è equivalente ad usare getline(std::cin, line) visto che hai la linea:

using std::cin; 

Utilizzando Argument Dependent Lookup (ADL), il compilatore è in grado di risolvere tale chiamata di funzione a std::getline(std::cin, line). Puoi leggere ulteriori informazioni su ADL al numero http://en.cppreference.com/w/cpp/language/adl.