【发布时间】:2015-08-08 00:04:45
【问题描述】:
我有一个std::shared_ptr<std::vector<std::vector<double>> sp,需要将(*sp)[i](对于某些i)传递给一个接受std::shared_ptr<std::vector<double>> 的函数foo。我该怎么做?
一个选项是foo(std::make_shared<std::vector<double>>((*sp)[i]),但这会创建矢量(*sp)[i] 的副本。由于(*sp)[i] 可能很大,我绝对不希望发生这种情况。
那么,有没有什么选项可以在不复制的情况下将(*sp)[i] 传递给foo?
编辑:也许我们可以这样做:
foo(std::shared_ptr<std::vector<double>>(&(*sp)[i], [](std::vector<double>* p) { }));
【问题讨论】:
-
恐怕不可能。为什么该函数首先采用
shared_ptr? -
std::shared_ptr有一个别名构造函数。参见例如stackoverflow.com/q/19102034 或 codesynthesis.com/~boris/blog/2012/04/25/… -
@Quentin 也许我们可以提供一个自定义的 delete 函数,它是无操作的。请注意我的编辑。
-
@0xbadf00d 我被巧妙地反驳了。谢谢你的问题,我学到了一些很酷的东西:)
-
如果你用自定义的无操作删除器创建一个新的
shared_ptr,你必须分配一个新的控制块。最好使用别名构造函数,它重用现有的控制块。
标签: c++ c++11 smart-pointers