我啥时候应该传递“T* const&”类型的指针?

Posted

技术标签:

【中文标题】我啥时候应该传递“T* const&”类型的指针?【英文标题】:When should I pass "T* const&" type of pointer ?我什么时候应该传递“T* const&”类型的指针? 【发布时间】:2011-10-01 22:16:46 【问题描述】:

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

【问题讨论】:

【参考方案1】:

如果指针对象的值可能会被函数外部的某些东西更改,并且您希望能够观察指针对象值的更改,或者如果您想要存储指向指针对象的引用或指针以供以后读取。

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

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

从技术上讲,即使是函数本身也可能会更改传递给它的引用的指针的值。

例如

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 );

【讨论】:

但是如果它被外部的东西改变了,它必须是不稳定的,对吧? @Mehrdad:不,我不知道你为什么这么认为。 The volatile type qualifier declares an item whose value can legitimately be changed by something beyond the control of the program in which it appears, such as a concurrently executing thread. @Mehrdad:只需通过const 引用参数以外的其他方式更改指针。严格来说,它甚至不必在函数外部,当然也不必超出程序的控制范围。 @Mehrdad:首先,如果它是由另一个线程完成的,volatile 不是答案。 volatile 和多线程永远不应该在你的脑海中出现! volatile 修复任何东西是完全错误的。顺便说一句,不,它不必由另一个线程完成。取消查尔斯发布的代码:char* globalP = 0; void global_fn() globalP = new char; int main() foo(globalP); 。观察foo执行过程中,ptr会发生变化,因为globalP会发生变化。【参考方案2】:

差异实际上为零。 const 引用用于防止复制昂贵的复制或在通用代码中不可复制的类型,但由于指针是微不足道的,它可以忽略不计,您也可以按值获取。

【讨论】:

【参考方案3】:

我认为一个更简单的例子可以说明 Charles Bailey 的观点。让我们删除它的指针部分的问题,因为对于这个问题它是无关紧要的。所以你的问题基本上变成了:

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

您是否更清楚地了解它是如何工作的?是的,在这两种情况下都不能分配局部变量“p”。是的,任何一段代码都不会影响调用范围内的变量。但在前一个示例中,p 可能是对可以更改的变量(非 const)int 的引用,而后者是按值传递的参数,无法更改。 (实际上第二个示例中的const 对函数之外的任何内容都没有影响,因此有点多余。与问题中的第二个示例相同。)

【讨论】:

以上是关于我啥时候应该传递“T* const&”类型的指针?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该使用 std::string / std::string_view 作为参数/返回类型

如果我在 C 或 C++ 中执行 `typedef`,我啥时候应该在 typedef'ed 类型的末尾添加 `_t`? [复制]

函子我啥时候应该使用它们它们的预期用途是啥[关闭]

我啥时候需要将异步函数的返回类型声明为未来对象?

我啥时候需要使用 super(props) 将 prop 传递给 react 组件的构造函数? [复制]

我啥时候应该使用 FutureBuilder?