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

时间:2013-06-20 17:35:36

标签: c++ c++11 shared-ptr

我无法将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);

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

4 个答案:

答案 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());

:-)