将std :: shared_ptr <char>转换为std :: shared_ptr <unsigned char =“”>

时间:2017-03-21 23:07:24

标签: c++ c++11

有没有一种方法可以将shared_ptr<char>转换为shared_ptr<unsigned char>

我想出了以下内容,但它看起来并不干净。

int main(int argc, char** argv)
{
    std::shared_ptr<char> p1 = std::make_shared<char>();

    std::shared_ptr<unsigned char> p2 = std::shared_ptr<unsigned char>(
        reinterpret_cast<unsigned char*>(p1.get()),
        [p1](unsigned char*) {});
}

1 个答案:

答案 0 :(得分:6)

您正在做的事情有一个现成的功能,reinterpret_pointer_cast

std::shared_ptr<unsigned char> p2 =
    std::reinterpret_pointer_cast<unsigned char>(p1);

结果指针与原始指针共享所有权。

相比之下,您自己的代码最终会有两个单独的所有权组。如果原始组首先死亡,则新指针将悬空!

如果您使用别名构造函数,可以使用p1.get()并与原始指针共享所有权。事实上,这些施法助手是如何实施的(见链接):

std::shared_ptr<unsigned char> p2(p1, reinterpret_cast<unsigned char*>(p1.get()));

这会创建一个与p1共享所有权的共享指针,但会将给定的值存储为第二个构造函数参数。