将const引用转换为智能指针而不复制

时间:2018-01-13 20:58:54

标签: c++ pointers shared-ptr

我有一个类Object,复制起来非常昂贵。我写了一个函数,它将对Object的const引用作为函数参数。现在在函数中我需要调用一个函数,它接受一个指向Object的共享指针。如何在不复制整个对象至少一次的情况下调用此函数?

3 个答案:

答案 0 :(得分:4)

您可以使用共享指针的别名构造函数:

void f(std::shared_ptr<X>);  // the other function

void my_function(const X& x)
{
    f(std::shared_ptr<X>(nullptr, &x));
}

但请注意,目前尚不清楚这是否正确:在这种情况下,f以下的任何内容都不会占用函数中x的实际生命周期的所有权份额。如果f的设计是正确的,那么理所当然地说它需要一个共享指针,以便它可以任意取出额外的生命周期份额,所以我只会非常谨慎地使用它。 / p>

唯一的“正确”解决方案(除了更改函数的签名)是使用共享指针实际管理相关对象的生命周期,并且可能会向{{1}添加enable_shared_from_this工具}}:

X

答案 1 :(得分:-1)

获取引用的地址,执行const_cast以除去const,然后将null删除器与指向智能指针构造函数的指针一起传递。空删除器是不执行任何操作的删除器。即。

std::shared_ptr(const_cast<my_type*>(&myRef), [] (my_type *) { })

请注意,如果您传递给的函数实际上希望对参数执行生命周期管理,则最终可能需要复制该对象。

答案 2 :(得分:-2)

当然,你可以这样做:

1/(4096*15*60)