我啥时候应该传递“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`? [复制]