std::cout
是std::ostream
的一个实例.我可以在一个名为/usr/include/c++/7/iostream
的文件中看到std::cout
的声明:
extern ostream cout; /// Linked to standard output
std::ostream
由typedef std::basic_ostream<char> std::ostream
定义.
而且,似乎无法创建std::ostream
的实例.请参阅此演示code snippet:
#include<iostream>
int main()
{
std::ostream os;
return 0;
}
以下是编译器对上述代码段的抱怨:
In file included from /opt/compiler-explorer/gcc-4.9.0/include/c++/4.9.0/iostream:39:0,
from <source>:1:
/opt/compiler-explorer/gcc-4.9.0/include/c++/4.9.0/ostream: In function 'int main()':
/opt/compiler-explorer/gcc-4.9.0/include/c++/4.9.0/ostream:384:7: error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits<char>]' is protected
basic_ostream()
^
<source>:5:18: error: within this context
std::ostream os;
^
问题是,既然std::basic_ostream<_CharT, _Traits>::basic_ostream()
被标记为受保护,那么std::cout
是如何创建的?
CppReference上的这个link似乎不是很有意义.它没有清楚地告诉我std::cout
是如何实现的,以及std::ostream
的构造函数是如何创建std::cout
的.据我所知,最相关的信息是:
全局对象
std::cout
和std::wcout
控制到与标准C输出流stdout
相关联的实现定义类型(从std::streambuf
派生)的流缓冲器的输出.
没什么了.
我正在用gcc 4.9
做Ubuntu
感谢@NathanPierson.
他告诉我的
std::basic_ostream
有一个构造函数,它接受指向std::basic_streambuf
对象的指针.std::cout
使用指向某个实现定义的派生类std::basic_streambuf
的实例的指针进行初始化.
,这让我更接近答案.