`const T* const` 是什么意思?

9

我正在阅读一个C++模板示例,其中一部分模板签名让我感到困惑。

我是否正确地理解了这个:

const T* const foo;
< p > foo 是指向 const Tconst* 吗?


foo 应该在声明的那一行进行初始化,因为一旦 foo 被创建,它就是常量,无法更改。 - bert-jan
所以,foo是一个指向const T的const *。你是正确的! - Marlon
@bert-jan,不完全正确。例如,这可以在构造函数的初始化列表中设置。但我想不出其他的了。 - Joshua Clark
8个回答

12

是的,它是一个指向常量 T 的常量指针,也就是说,您既不能修改指针,也不能修改它所指向的内容。

const T* 只会禁止您修改指针所指向的任何内容,但它允许您(在语言的范围内)检查 *(foo+1)*(foo-1) 处的值。当您传递指向不可变数组的指针(例如只能读取的 C 字符串)时,请使用此形式。

T * const 意味着您可以修改 foo 指向的 T 值,但您无法修改指针本身;因此,您不能说 foo++; (*foo)++ ,因为第一个语句将增加(修改)指针。

T * 将为您提供完全的自由:您获得一个指向数组的指针,并且可以检查和修改该数组的任何成员。


@user997112:打错字了,抱歉。应该是 T * const。从右往左读,表示指向 T 的常量指针。你可以修改它所指向的值,但不能修改指针本身,因此无法修改相邻的内存部分。 - Fred Foo
@BenjaminLindley:错别字已修正。谢谢! - Fred Foo
@Benjamin,你的意思是说*(foo+1)是允许的,但(*foo)+1不允许吗? - user997112
@user997112:(*foo) +1 在任何情况下都是允许的。但是当值为 const 时,(*foo)++ 是不允许的(无论指针是否为 const)。 - Fred Foo
@user997112:你在这里涉及到了一些微妙的术语 :) 对于 T *const foo,添加 (*foo)+1 是允许的,因为它只产生一个值(而不是变量!),而 (*foo)++ 将修改 foo 指向的值;该已被声明为 const - Fred Foo
显示剩余5条评论

3

是的,这正是它的意思。

由于在使用指针时,const 经常会引起一些混淆,因此有以下几种可能性:

  • const T * aConstant

    表示 aConstant 是一个指向 constant T可变指针

  • T const * aConstant

    完全相同。

  • T * const aConstant

    声明 aConstant 是一个指向 variable T不变指针

  • T const * const aConstant(或 const T * const aConstant

    声明了一个指向 constant T不变指针


2
这是一个指向常量T的常量指针。所以如果T是int类型,那么array就是指向int类型的指针,而且有两种方式被定义为常量:

指向常量:指针指向的值不能被更改(或者指向const int) 常量指针:指针中存储的内存地址不能更改

这也可以写成 T const * const array

参见关于const正确性的维基


1

是的,foo是一个指向常量T的常量指针。


1

是的。


const T*

将数组的元素设置为const... 至少在foo方面是如此。

foo[0] = T(); // Illegal!
foo[1] = T(); // Illegal!
foo[2] = whatever; // Illegal!

const

foo变为常量指针。因此,以下操作是非法的:

foo = &some_array;

变量

foo

如果你不知道这是什么,你应该认真考虑去上幼儿园。


@BenjaminLindley 不用担心,只需交换描述即可。 ;) - Mateen Ulhaq

0

是的,我认为变量(const)的名称让你感到困惑。


1
任何语法可以交换并仍保留意义吗? - user997112

0

是的,它的意思很简单,不仅你不能改变 foo 指向的东西,还不能将 foo 的值本身更改为指向其他的 T 实例。


0

只需像这样简单地解析它

const<ptr<const<T>>> foo

虽然这是非法的,但我认为每个人都可以掌握其实质。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接