From: Bo Persson (bop_at_[hidden])
Date: 2006-11-20 13:51:21
Howard Hinnant wrote:
> On Nov 20, 2006, at 7:48 AM, John Maddock wrote:
>> As an aside, I've always wanted a sort of "conceptual" std lib
>> implementation, that included in each header nothing except what
>> has to be there. Just the declarations would do, so we could do
>> compile-time tests against it to verify inclusion of the right
>> headers: the
>> only tricky bit is getting the compile time constants correct so
>> that it can
>> still compile meta code. Any volunteers? :->
> One of the problems with this project is deciding exactly what
> appear in the headers. For example, imho, this is a valid C++
> #include <iostream>
> int main()
> std::cout << "Hello World\n";
> In order for that to be valid, <iostream> must declare and define
> the namepace scope:
> template<class traits>
> basic_ostream<char, traits>&
> operator<< (basic_ostream<char, traits>& out, const char* s);
> which lives in <ostream>. In other words, I think it would be
> incorrect for <iostream> *not* to include <istream> and <ostream>.
But the standard doesn't say so explicitly. So how do we know?
Section 27.3 just says that "The header <iostream> declares objects
that...". It doesn't say that any types or operators are defined.
> I have heard people argue that HelloWorld should include <ostream>
> explicitly as well. But imho that leads to a C++ language spec that
> is just too difficult and cumbersome to use (and we're already at
> risk for that reputation).
It *is* possible to just include <iosfwd> to be able to declare (not define)
the extern stream objects. Isn't that what <iosfwd> was designed for?