“const T*const”是什么意思? 我正在阅读一个C++模板例子,模板签名的一部分让我困惑。
我读对了吗:“const T*const”是什么意思? 我正在阅读一个C++模板例子,模板签名的一部分让我困惑。,c++,pointers,constants,C++,Pointers,Constants,我读对了吗: const T* const foo; 是fooaconst*到aconst T?是的,我认为var(const)的名字让你感到困惑。是的,foo是指向常量T的常量指针。是的;这正是它的意思 由于在使用指针时总是会对const产生一些混淆,因此存在以下可能性: const T*a常数 表示a常量是指向常量T的变量指针 T常数*a常数 完全一样 T*常数常数 声明aConstant是指向变量T和的常量指针 T常数*const常数(或const T*const常数) 声明指向常量T
const T* const foo;
是
foo
aconst*
到aconst T
?是的,我认为var(const)的名字让你感到困惑。是的,foo是指向常量T的常量指针。是的;这正是它的意思
由于在使用指针时总是会对const
产生一些混淆,因此存在以下可能性:
表示const T*a常数
是指向a常量
常量T的变量指针
完全一样T常数*a常数
声明T*常数常数
是指向aConstant
和的常量指针变量T
(或T常数*const常数
) 声明指向const T*const常数
的常量指针常量T
T
的常量指针。也就是说,您既不能修改指针,也不能修改它指向的对象
const T*
只会禁止您修改指针指向的任何内容,但它允许您(在语言范围内)检查*(foo+1)
和*(foo-1)
处的值。当您将指针传递给不可变数组(例如您只应该读取的C字符串)时,请使用此表单
T*const
意味着您可以修改foo
指向的T
值,但不能修改指针本身;所以你不能说foo++;(*foo)++
,因为第一条语句将递增(修改)指针
T*
将给您充分的自由:您将指针放入数组中,您可以检查和修改该数组的任何成员。这是指向常量T的常量指针。因此,如果T是int,那么数组是指向int的指针,int有两种方式:
指针指向常量:指针指向的值不能更改(或指向常量int)
常量指针:指针中存储的内存地址不能更改
这与T常量*常量数组
请参阅。是
使数组的元素保持常量。。。至少就
foo
而言
foo[0] = T(); // Illegal!
foo[1] = T(); // Illegal!
foo[2] = whatever; // Illegal!
使
foo
成为常量指针。因此,这是非法的:
foo = &some_array;
变量
foo
……如果你不知道这是什么,你应该认真考虑去幼儿园。
是的,它只是意味着你不仅不能改变<代码> Foo指向,而且你也不能改变<代码> FoO 本身的值,因此它指向其他的<代码> T < /代码>实例。
< P>简单地像这样< /P>解析它。const<ptr<const<T>>> foo
const foo
虽然它是非法的,但我认为每个人都能把握它的本质 任何一种语法都可以互换并保留其含义吗?foo应该在声明的行上初始化,因为一旦foo被激活,它就不能更改,因为它是常量。从右到左阅读:foo是一个
const*
到const T
。所以你是对的@伯特·简,不完全正确。例如,这可以在构造函数的初始值设定项列表中设置。不过,我想不出其他任何东西。在最后一个例子中,t const*指针的类型是什么?我猜在“*”之后会发生什么?我还假设它意味着一个常量指针(某种类型)指向一个非常量类型T?@user997112:typo,对不起。它应该是T*const
。这意味着,从右向左读取指向T
的常量指针。您可以修改指针指向的值,但不能修改指针本身,因此您不能修改内存的相邻部分。@BenjaminLindley:typo,已修复。谢谢@本贾明林德利:在一个常数T*
的情况下?不,您可以检查这些值。修改它们需要关闭常量。@Benjamin,你是说*(foo+1)是允许的,但是(*foo)+1是不允许的?@BenjaminLindley不用担心,只需切换描述即可
foo
const<ptr<const<T>>> foo