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

convert const reference to smart pointer without copying

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

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

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 设计正确,那么按理说它需要一个共享指针,以便它 可以 任意取出额外的生命周期份额,所以我只会在极端情况下使用它注意。

唯一的 "correct" 解决方案(除了更改函数的签名之外)是使用共享指针实际管理相关对象的生命周期,并且可能添加一个 enable_shared_from_this 工具到 X:

void my_function(const X& x)
{
    f(x.shared_from_this());  // X must be changed to support this
}

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

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

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