The C++ standard library provides the following headers related to iostreams:
<ios> <iosfwd> <istream> <ostream> <streambuf> <iostream> <fstream> <sstream> <strstream> [deprecated] <iomanip> What is the simplest, most sensible rule for when to #include which of these headers? (If the answer is different in different versions of C++, I'm most interested in C++17. And I'm most interested in what is guaranteed to work, not which headers happen to include other headers in libstdc++ or whatever.)
I would like to believe that I can always get by with <iostream>, <fstream> (only if I use fstreams), and/or <sstream> (only if I use stringstreams). This seems to work for simple programs like
#include <iostream> int main() { std::cout << std::hex << 42 << std::endl << std::flush; } But if I add std::setw(42) to that program, then it stops compiling; I need to include <iomanip> as well in that case.
So the rule seems to be "include <iostream>, <fstream>, and/or <sstream>; and additionally include <iomanip> if you're using any of these manipulators."
If I follow this rule religiously, will I ever run into a case where I need to include <ios>, <iosfwd>, <istream>, <ostream>, and/or <streambuf> in my application code?