10

我无法存储std::coutstd::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

3 回答 3

15

您的要求很奇怪,但是您当然可以std::ostreamshared_ptr<std::ostream>提供的内容中存储一个指向的指针,您需要处理适当的处理程序操作:例如:std::shared_ptr<std::ostream>(&std::cout, [](void*) {});

于 2013-06-20T17:44:05.030 回答
13

这显然不应该这样做:

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

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

如果您必须绝对使用 a shared_ptr(我认为这是 API 兼容性问题),解决方案是使用不执行任何操作的自定义删除器:

shared_ptr<std::ostream> p_cout(&std::cout, [](std::ostream*){});
于 2013-06-20T17:42:04.153 回答
-1

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

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

于 2013-06-20T17:40:24.687 回答