I'm curious about the technical reason for cin.getline and the global getline function being in different places.
What was the motivation for not simply defining all these function signatures for cin:
//THESE TWO EXIST
istream& cin::getline (char* s, streamsize n );
istream& cin::getline (char* s, streamsize n, char delim );
//THESE TWO COULD EXIST
istream& cin::getline (string &s);
istream& cin::getline (string &s, char delim );
Was it because other types may want to be added and they didn't want to marry the string to cin?
See my answer for a similar question. It might be an oversight by the C++ Standard committee, but it can also be explained with dependency concerns. If the standard would require function overloads for std::string in the <iostream> header then it would require implementers to #include<string> in <iostream>. That's a dependency requirement, which would further slow down compiling anything that requires <iostream> -- even if a compilation unit doesn't itself need std::string.
Do note that on the other hand the <string> header has functions that take a reference to std::basic_istream<> and std::basic_ostream<>; but the standard also requires a header named <iosfwd> which forward-declares all IO facilities, making the <string> header dependable on the compile-time fast <iosfwd> header. A dependency the other way around would be much slower to compile.
More or less. "They" probably didn't want to have std::istream depend on std::string in any way, probably to minimize coupling.
Note that std::getline() is defined in the <string> module.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With