簡體   English   中英

可以將std :: unique_ptr用作參數嗎?

[英]Can std::unique_ptr be used as an argument?

現在,我只是在研究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。 為什么不? 我認為在TestPrint函數中pTest是std :: unique_ptr,而p_pData是std :: unique_ptr。 所以是同一類型! 但是我不能。 我想知道為什么它不起作用。

當然,將函數更改為std::unique_ptr<T_TEST>& p_pData之后,它就可以工作。 但是我不明白為什么即使數據類型相同也無法傳遞參數。

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)時才將智能指針用作函數參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM