当我打算更改函数内的指向值时,我会传递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
答案 0 :(得分:10)
如果指针对象的值可能被函数外部的某些内容更改,并且您希望能够观察指针对象值的更改,或者您希望能够使用T* const &
作为参数想要存储指针对象的引用或指针,以便以后阅读。
T*
参数(相当于T* const
作为函数参数)只是给你一个指针对象的副本,它是传递给你的函数时它的值的快照。
void foo( char* const& ptr )
{
char* p1 = ptr; // initial value
global_fn(); // ptr might be changed
char* p2 = ptr; // new value of ptr
}
VS
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
}
从技术上讲,即使函数本身也可能会改变传递给它的引用的指针值。
E.g。
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 );
}
答案 1 :(得分:3)
差异实际上是零。 const引用用于防止复制昂贵的复制,或者在通用代码中复制不可复制的类型,但由于指针是微不足道的,因此它可以忽略不计,您也可以按值进行复制。
答案 2 :(得分:0)
我认为一个更简单的例子可以说明Charles Bailey正在制作的观点。让我们删除指针部分的问题,因为对于这个问题它是无关紧要的。所以你的问题基本上变成了:
void foo(const int &p); // p is not changeable
void foo(const int p); // p is not changeable
你能更清楚地看到它的运作方式吗?是的,在这两种情况下都无法分配局部变量“p”。是的,这两段代码都不会影响调用范围中的变量。但在前一个示例中,p
可以是对可以更改的变量(非常量)int的引用,而后者是通过值传递的参数,该值无法更改。 (实际上第二个例子中的const
对函数之外的任何东西没有影响,所以它有点多余。与问题中的第二个例子相同。)