【问题标题】:Can std::unique_ptr be used as an argument?std::unique_ptr 可以用作参数吗?
【发布时间】:2015-07-29 11:20:01
【问题描述】:

现在,我正在研究 smart_ptr (unique_ptr / shared_ptr)。我写了这样的测试代码来检查 unique_ptr 是否可以用作参数。

typedef struct __T_TEST
{
char cT1;
char cT2;
} T_TEST;

int main(...)
{
...
char szB[2] = {0x61, 0x62};

auto pTest = std::make_unique<T_TEST>();
std::memcpy(pTest, szB, 2);
printf("T1 = [%02x]\n", pTest->cT1);
printf("T2 = [%02x]\n", pTest->cT2);

return 0;
}

然后,我添加了一个使用 unique_ptr 作为参数的函数。

int TestPrint(std::unique_ptr<T_TEST> p_pData)
{
    printf("T1 in TestPrint Func = [%02x]\n", p_pData->cT1);
    printf("T2 in TestPrint Func = [%02x]\n", p_pData->cT2);
    return 0;
}

我只是在 printf 之后在 main 函数中调用该函数。但它不起作用。

printf("T1 = [%02x]\n", pTest->cT1);
printf("T2 = [%02x]\n", pTest->cT2);

TestPrint(pTest);  <- Can't pass the pTest!

return 0;
}

在这种情况下,我无法通过 pTest。为什么不?我认为 pTest 是 std::unique_ptr , p_pData 是 TestPrint 函数中的 std::unique_ptr 。所以是同一类型!!但我不能。我想知道为什么它不起作用。

当然,改成std::unique_ptr&lt;T_TEST&gt;&amp; p_pData后就可以工作了。但是我不明白为什么尽管数据类型相同,但我不能传递参数。

【问题讨论】:

  • 因为可复制的 unique_ptr 现在不会很独特了吧?

标签: c++


【解决方案1】:

std::unique_ptr 是只能移动的类型(不能复制),如果你想把它作为参数传递给函数,你可以

1 : 通过引用传递

int TestPrint(std::unique_ptr<T_TEST> const &p_pData)
{
    printf("T1 in TestPrint Func = [%02x]\n", p_pData->cT1);
    printf("T2 in TestPrint Func = [%02x]\n", p_pData->cT2);
    return 0;
}

2 : 移动它

TestPrint(std::move(pTest));

3 : 不要使用 unique_ptr 作为参数,使用指针

int TestPrint(T_TEST *p_pData)
{
    printf("T1 in TestPrint Func = [%02x]\n", p_pData->cT1);
    printf("T2 in TestPrint Func = [%02x]\n", p_pData->cT2);
    return 0;
}

TestPrint(pTest.get());

指针不擅长资源管理,但擅长访问资源,如果不需要将所有权传递给函数,可以用指针代替unique_ptr,恕我直言,这样更灵活,因为原始指针可以使用shared_ptr、unique_ptr、weal_ptr等智能指针,但unique_ptr必须只和unique_ptr一起使用。

在大多数情况下,我只在想要共享(std::shared_ptr)或转让所有权(std::unique_ptr)时使用智能指针作为函数参数。

【讨论】:

  • 如果您知道unique_ptr 不为空,您还可以传递对底层对象的引用。
  • 谢谢,立体匹配!这对我来说是完美的答案! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2016-03-31
  • 2016-03-21
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
相关资源
最近更新 更多