`clog` 被缓冲了吗?

Is `clog` buffered?

我在很多地方看到clogcerr是一样的,只是clog有缓冲而cerr没有。但是我在我的电脑上看不到这种行为(Ubuntu 20.04,clang 9)。这是我使用的代码:

clog << "AA";
this_thread::sleep_for(chrono::seconds(3));
clog << endl;
clog << "BB" << endl;

当我使用 cout 而不是 clog 时,前 3 秒我没有看到任何东西;然后我马上看到AA和BB。

当我使用 cerr 而不是 clog 时,我立即看到 AA,然后在 3 秒后我看到 BB。

当我使用 clog 时,我看到的与 cerr 完全一样 --- 立即 AA,然后在 3 秒后我看到 BB。

如果 clog 被缓冲,它的行为不应该像 cout 吗?

这是我的编译器中的错误吗?

这不是一个错误,clog 不应该被缓冲,事实上标准不会以任何方式将 clogcout 相关联,也没有说明 clog 应该被缓冲。

它确实声明 cerrclog 都与 stderr 关联,因此如果行为有一些相似之处,则应该在 clog 之间和 cerr,这似乎是您正在经历的。

由于 stderr 被定义为无缓冲,因此 clog 也是无缓冲的逻辑,但由于未指定此行为,因此不能保证始终如此。

coutstdout 关联,其缓冲设置取决于环境。通常,对于 UNIX 系统,它是行缓冲的。

29.4.3 窄流对象 [narrow.stream.objects]

ostream cout;

3 - The object cout controls output to a stream buffer associated with the object stdout, declared in <cstdio>(29.12.1).

ostream cerr;

4 - The object cerr controls output to a stream buffer associated with the object stderr, declared in <cstdio>(29.12.1).

[...]

ostream clog;

6 - The object clog controls output to a stream buffer associated with the object stderr, declared in <cstdio>(29.12.1).