Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“const T*const”是什么意思? 我正在阅读一个C++模板例子,模板签名的一部分让我困惑。_C++_Pointers_Constants - Fatal编程技术网

“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
a
const*
到a
const 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