我什么时候应该通过“T * const&”指针类型?

时间:2011-07-09 16:00:58

标签: c++ pointers const pass-by-reference

当我打算更改函数内的指向值时,我会传递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

3 个答案:

答案 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对函数之外的任何东西没有影响,所以它有点多余。与问题中的第二个例子相同。)