[英]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.