簡體   English   中英

我什么時候應該傳遞“T* const&”類型的指針?

[英]When should I pass “T* const&” type of pointer ?

當我打算更改 function 內的指向值時,我會傳遞T*&指針:

void foo(char *&p)
{
  p = (b == true)? new char[10] : 0;
}

但我無法了解T* const&類型的指針的用例是什么(因為該指針不可更改)? 我的意思是為什么我不應該簡單地通過T* const

void foo(char* const &p);  // p is not changeable
void foo(char* const p);   // p is not changeable

如果指針T* const &的值可能會被 function 外部的東西改變,並且您希望能夠觀察到指針 ZA8CFDE6331BD59EB62AC96F89111 的值的變化,或者您想存儲 aC4參考或指向指針 object 供以后閱讀。

T*參數(相當於T* const作為 function 參數)只為您提供指針 object 的副本,這是它傳遞給 ZC1C425268E68385D1AB5074C17A9 時的值的快照。

void foo( char* const& ptr )
{
    char* p1 = ptr; // initial value
    global_fn();    // ptr might be changed
    char* p2 = ptr; // new value of ptr
}

對比

void foo2( char* ptr )
{
    char* p1 = ptr; // initial value
    global_fn();    // ptr can't be changed, it's local to this function
    char* p2 = ptr; // will be the same as p1
}

從技術上講,即使是 function 本身也可能會更改傳遞給它的引用的指針的值。

例如

char* p;

std::ptrdiff_t foo( char* const& ptr )
{
    ++p;
    return p - ptr; // returns 0, would return 1 if the parameter was by value
}

int main()
{
    char test[] = "Hello, world!";
    p = test;
    foo( p );
}

差異實際上為零。 const 引用用於防止復制昂貴的復制或在通用代碼中不可復制的類型,但由於指針是微不足道的,它可以忽略不計,您也可以按值獲取。

我認為一個更簡單的例子可以說明查爾斯·貝利提出的觀點。 讓我們刪除它的指針部分的問題,因為對於這個問題它是無關緊要的。 所以你的問題基本上變成了:

void foo(const int &p);  // p is not changeable
void foo(const int p);   // p is not changeable

你更清楚地看到它是如何工作的嗎? 是的,在這兩種情況下都不能分配局部變量“p”。 是的,這兩條代碼都不會影響調用 scope 中的變量。 但在前一個示例中, p可以是對可以更改的變量(非 const)int 的引用,而后者是按值傳遞的參數,無法更改。 (實際上第二個示例中的const對 function 之外的任何內容都沒有影響,所以它有點多余。與問題中的第二個示例相同。)

暫無
暫無

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

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