可以将std :: unique_ptr用作参数吗?

时间:2015-07-29 01:21:21

标签: c++

现在,我正在研究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后,它可以正常工作。但我不明白为什么我不能传递参数,尽管数据类型相同。

1 个答案:

答案 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)时,我只使用智能指针作为函数参数。