【发布时间】:2022-12-19 22:33:07
【问题描述】:
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;
}
以下是编译器对上面代码 sn-p 的抱怨:
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控制输出到实现定义类型的流缓冲区(派生自std::streambuf),与标准 C 输出流stdout相关联。仅此而已。
我正在与
gcc 4.9一起工作Ubuntu感谢@NathanPierson。
他告诉我
std::basic_ostream有一个构造函数,该构造函数接受指向std::basic_streambuf对象的指针。std::cout使用指向std::basic_streambuf的某个实现定义的派生类的实例的指针进行初始化。,这让我离答案更近了。
【问题讨论】:
-
@DrewMcGowen 但
cout实际上是std::ostream的一个实例,而不是从std::ostream派生的。 -
对,那是正确的。
std::basic_ostream有一个构造函数,它接受一个指向std::basic_streambuf对象的指针。std::cout使用指向std::basic_streambuf的某个实现定义的派生类的实例的指针进行初始化。如果您需要更多详细信息,则需要指定您要询问的实现方式。 -
听起来您在看到标准库实现的实际代码之前不会感到满意。因此,您可能希望以浏览 GNU C++ 标准库的代码为起点。
-
@John 这取决于实现如何实现标准指定的行为。没有唯一的答案,只有每个实现决定做什么。