为什么在Compiler Explorer上,"std::cout << char() << std::endl;"甚至不能打印一个新行?

3

这段代码:

#include <iostream>

int main() {
    std::cout << "---" << std::endl;
    std::cout << char() << std::endl;
    std::cout << "---" << std::endl;
}

打印这个

---
---

为什么std::endl没有导致其他两者之间有新行?

移除char() <<会使输出变成我预期的:

---

---

5
这将是您终端的解释。输出中有一个空字符,我认为终端应该将其忽略为不可打印字符,但我怀疑这是否在任何地方标准化。您看的是哪个终端? - user17732522
1
可以在godbolt上复现:https://godbolt.org/z/nfEcEPx6z - jabaa
2
看起来这不是关于C++的问题,而是关于Compiler Explorer如何打印输出的问题。它是开源的:https://github.com/compiler-explorer/compiler-explorer - jabaa
1
Godbolt在输出中稍微修改了一些内容,以隐藏其内部细节。例如:https://godbolt.org/z/TE84j7so9 - Jerry Coffin
1
如果godbolt能够输出作为char()的结果,那就太好了。下次我见到Matt Godbolt,我会向他提一下这个问题。 - Eljay
显示剩余6条评论
1个回答

4
这段代码会导致标准库在流中打印一个空字符,然后跟着一个换行符。
这些字符如何呈现给您取决于您用来查看流内容的终端或其他用户界面。
通常情况下,我希望终端会将空字符视为不可打印字符,并按照通常方式解释换行符。然而,我认为没有任何标准或规范要求这种行为。
在这个具体的案例中,我怀疑编译器探索器在呈现输出时存在错误,可能是基于https://github.com/rburns/ansi-to-html的 AnsiToHtml 中的问题,用于格式化包含 ANSI 转义码的编译器输出。该库对输入进行了一些标记化处理,因此这种类型的错误似乎并不罕见,但我对 JavaScript/TypeScript 的了解不足以通过快速查看找出问题所在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接