我无法将std::cout
存储在std::shared_ptr<std::ostream>
。
因为显然不应该这样做:
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);
有人知道法律解决方法吗?
答案 0 :(得分:10)
您的要求很奇怪,但您当然可以在提供的std::ostream
中存储指向shared_ptr<std::ostream>
的指针,您需要处理正确的处理程序操作:例如:std::shared_ptr<std::ostream>(&std::cout, [](void*) {});
答案 1 :(得分:8)
显然不应该这样做:
std::shared_ptr<std::ostream> p_cout(&std::cout);
确实,这应该从不完成。原因是因为您没有std::cout
的所有权,因此当您的上一个shared_ptr
超出范围时,它会尝试删除std::cout
(这很简单)。但你已经知道了。
解决方案,如果你必须绝对使用shared_ptr
(我认为这是API兼容性的问题),那就是使用一个不做任何事情的自定义删除器:
shared_ptr<std::ostream> p_cout(&std::cout, [](std::ostream*){});
答案 2 :(得分:-1)
shared_ptr将获得您提供的指针的所有权。这意味着您的程序最终会尝试删除std :: cout(当初始shared_ptr的最后一个副本超出范围时)。这不是你想要做的事情。
由于你不需要将生命周期控制到std :: cout,你可以简单地传递一个std :: ostream原始指针或引用。
答案 3 :(得分:-1)
尝试一下:
auto p_cout = std::make_shared<std::ostream>(std::cout.rdbuf());
:-)