gpt4 book ai didi

c++ - 将流绑定(bind)到自身

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:37 26 4
gpt4 key购买 nike

为什么这段代码在 g++ 和 clang ( libstdc++ ) 上运行成功,但给出一个段错误 libc++ :

#include <iostream>

int main()
{
std::cout.tie(&std::cout);
std::cout << 123;
}

我认为应该发生的是 std::cout.flush() 应该在输出实际发生之前被调用。为什么这会产生段错误?

最佳答案

[ostream.unformatted]/p7:

basic_ostream& flush();

7 Effects: Behaves as an unformatted output function [...]

[ostream.unformatted]/p1:

Each unformatted output function begins execution by constructing an object of class sentry.

[ostream::哨兵]/p2:

explicit sentry(basic_ostream<charT,traits>& os);

2 If os.good() is nonzero, prepares for formatted or unformatted output. If os.tie() is not a null pointer, calls os.tie()->flush().324

3 [...]

324 The call os.tie()->flush() does not necessarily occur if the function can determine that no synchronization is necessary.

如果你将一个流绑定(bind)到它自己,然后为了刷新流,它会构造一个 sentry,它会尝试刷新流,它会构造一个 sentry,它会尝试刷新流,它构造一个 sentry,它试图刷新流,它构造一个 sentry……我想你明白这是怎么回事了。

如果您运气不好,根据脚注 324,实现可能会跳过某处的 flush() 调用;否则,您将看到该站点的标题。

关于c++ - 将流绑定(bind)到自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28142886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com