现在,我正在研究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<T_TEST>& p_pData
后,它可以正常工作。但我不明白为什么我不能传递参数,尽管数据类型相同。
答案 0 :(得分:3)
std :: unique_ptr是一个只移动的类型(无法复制),如果你想把它作为参数传递给函数,你可以
1:通过引用传递
<xsl:template name="aclTokenizer">
<xsl:param name="text" />
<xsl:param name="separator" select="';'"/>
<xsl:choose>
<xsl:when test="not(contains($text, $separator))">
<meta name="google:aclusers" content="{normalize-space($text)}" />
</xsl:when>
<xsl:otherwise>
<meta name="google:aclusers" content="{normalize-space(substring-before($text, $separator))}" />
<xsl:call-template name="aclTokenizer">
<xsl:with-param name="text" select="substring-after($text, $separator)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
2:移动它
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;
}
3:不要使用unique_ptr作为参数,使用指针
TestPrint(std::move(pTest));
指针在资源管理上很差,但是在访问资源方面很好,如果你不需要将所有权传递给函数,你可以使用指针来替换unique_ptr,这是更加灵活的恕我直言,因为原始指针可以使用shared_ptr,unique_ptr,weal_ptr和其他智能指针,但unique_ptr只能与unique_ptr一起使用。
在大多数情况下,当我想共享(std :: shared_ptr)或转让所有权(std :: unique_ptr)时,我只使用智能指针作为函数参数。