来自std :: cout的C++ 11 std :: shared_ptr <std :: ostream>

Tim*_*Tim 7 c++ shared-ptr c++11

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

因为这显然不应该这样做:

std::shared_ptr<std::ostream> p_cout(&std::cout);
Run Code Online (Sandbox Code Playgroud)

这甚至不可能,因为无法复制std :: ostream:

std::shared_ptr<std::ostream> p_cout = std::make_shared<std::ostream>(std::cout);
Run Code Online (Sandbox Code Playgroud)

有人知道法律解决方法吗?

Pau*_*lik 13

你要求很奇怪,但你当然可以存储指向std::ostreamshared_ptr<std::ostream>提供,你照顾一个适当的处置行动:,例如:std::shared_ptr<std::ostream>(&std::cout, [](void*) {});


sya*_*yam 10

显然不应该这样做:

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*){});
Run Code Online (Sandbox Code Playgroud)