是否可以使用 NULL streambuf 初始化 std::iostream?

Is it okay to initialize a std::iostream with a NULL streambuf?

提问人:user3188445 提问时间:10/21/2023 更新时间:10/21/2023 访问量:60

问:

我想与文件描述符一起使用。不幸的是,由于除了 0-2 之外,没有其他可移植的方法可以将文件描述符放入或(至少在 C++26 之前)从 ,我必须实现自己的 streambuf 类型,我称之为 。我现在想实现这样的:std::iostreamfstreamfdstreambuffdstream

struct fdstream : public std::iostream {
  fdstreambuf buf_;
  fdstream(int fd) : buf_(fd) { rdbuf(&buf_); }
};

不幸的是,这不起作用,因为它没有默认构造函数。当我查看 gcc 的 libstdc++ 如何实现 ostringstream 之类的东西时,它使用默认构造函数用于 ,即使这样的构造函数不是 C++ 规范的一部分。我可以通过最初传入来做同样的事情。(由于不会在超类型之前初始化,因此我不想使用 .所以现在这似乎有效:std::iostreamostream0streambuf*iostreamnullptrstreambufbuf_&buf_

  fdstream(int fd) : std::iostream(nullptr), buf_(fd) { rdbuf(&buf_); }

我的问题是:上述代码合法吗?如果不是,您应该如何定义一个包含自己的 streambuf 类型作为结构字段的类型?iostream

我想另一个问题是我是否错过了访问文件描述符的其他方式?C++ 规范要求标准库提供使用文件描述符的 streambuf,这似乎非常不幸,因为 cin、cout 和 cerr 必须存在,但它也会阻止代码访问文件描述符。因此,如果你需要用 打开一个文件,或者通过 Unix 域套接字接收文件描述符,或者调用 或 或 在文件描述符上,你基本上需要复制一堆已经在标准库中的逻辑来使用 iostream。O_CLOEXECfsyncfstatfchmod

C++ iostream 流buf

评论


答: 暂无答案