C++11 std::shared_ptr<std::ostream> from std::cout

C++11 std::shared_ptr<std::ostream> from std::cout

本文关键字:std gt from cout ostream shared ptr C++11 lt      更新时间:2023-10-16

我在std::shared_ptr<std::ostream>中存储std::cout时遇到问题。

既然这显然不应该这样做:

std::shared_ptr<std::ostream> p_cout(&std::cout);

这是不可能的,因为不可能复制std::ostream:

std::shared_ptr<std::ostream> p_cout = std::make_shared<std::ostream>(std::cout);

有人知道法律上的变通办法吗?

您的要求很奇怪,但您当然可以将指向std::ostream的指针存储在shared_ptr<std::ostream>中。如果您提供了适当的处理器操作:例如:std::shared_ptr<std::ostream>(&std::cout, [](void*) {});

这显然是不应该做的:

std::shared_ptr<std::ostream> p_cout(&std::cout);

事实上,永远不应该这样做。原因是你没有std::cout的所有权,因此当你的最后一个shared_ptr超出范围时,它会试图删除std::cout(这显然是邪恶的)。但你已经知道了。

如果您必须绝对使用shared_ptr(我认为这是API兼容性的问题),那么解决方案是使用一个什么都不做的自定义deleter:

shared_ptr<std::ostream> p_cout(&std::cout, [](std::ostream*){});

shared_ptr将获得您给它的指针的所有权。这意味着您的程序最终将尝试删除std::cout(当初始shared_ptr的最后一个副本超出范围时)。这不是你想做的事。

由于您不需要控制std::cout的生存期,因此可以简单地传递std::ostream原始指针或引用。