我正在阅读一个C ++模板示例,模板签名的一部分使我感到困惑。
我是否正确阅读:
const T* const foo;
foo
是const*
到const T
吗?
是的,它是一个常量指针T
。即,你既不能修改指针,也不能修改指向它的东西。
const T*
只会禁止你修改指针指向的任何东西,但它允许你(在语言的范围内)检查*(foo+1)
和*(foo-1)
的值。当您将指针传递给不可变数组(例如您应该阅读的C字符串)时,请使用此表单。
T * const
意味着你可以修改T
指向的foo
值,但你不能修改指针本身;所以你不能说foo++; (*foo)++
因为第一个语句会增加(修改)指针。
T *
会给你完全的自由:你得到一个指向数组的指针,你可以检查和修改该数组的任何成员。
是;这正是它的意思。
由于在使用指针时总是对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
的常量指针。是的,foo是常量T的常量指针。
这是一个const指针到const T.所以如果T是一个int,那么数组是一个指向int的指针,它是两种方式的const:
指向const的指针:指针指向的值无法更改(或指向const int)const指针:存储在指针中的内存地址无法更改
这也和T const * const array
一样
是的,我认为var(const)的名字是你的绊脚石。
是的,它只是意味着你不仅不能改变foo
指向的东西,而且你也无法改变foo
本身的值,以便它指向其他一些T
实例。
是。
const T*
至少,就const
而言,制作数组foo
的元素。
foo[0] = T(); // Illegal!
foo[1] = T(); // Illegal!
foo[2] = whatever; // Illegal!
const
使foo
成为一个常量指针。因此,这是非法的:
foo = &some_array;
变量
foo
......如果你不知道这是什么,你应该认真考虑去学前班。
只需像这样解析它
const<ptr<const<T>>> foo
虽然这是违法的,但我认为每个人都可以掌握其本质。