【发布时间】:2014-02-08 10:26:41
【问题描述】:
当引用某个东西时,可以添加额外的const 限定符,这样引用的变量就不能被修改,如下所示:
int *ptr;
int const * const &rptr = ptr;
//ptr can't be changed and *ptr can't be changed
或者像这样,用一个数组:
int arr[1];
int const (&rarr)[1] = arr;
//arr[0] can't be changed
或者甚至像这样,带有一个指针数组:
int *ptrarr[1];
int * const (&rptrarr)[1] = ptrarr;
//ptrarr[0] cannot be changed, but *ptrarr[0] can be
那么,为什么我不能把这些结合起来做这个呢?
int *ptrarr[1];
int const * const (&why)[1] = ptrarr; //error
尝试此操作时,Clang 3.5 produces the following error 和 GCC 4.8.1 类似:
错误:对
const int *const [1]类型的引用无法绑定到int *[1]类型的左值
用const 保护引用的指针数组的所有部分的正确方法是什么?
注意:这是一个人为的例子,但我希望这会带来对以后有用的语言的知识。
【问题讨论】:
-
这是什么
int *ptr{};?我有C背景。我以前从未见过这种情况。 -
@FiddlingBits,大括号将其初始化为 C++11 中的
nullptr。几乎等同于int *ptr = 0;。如果你愿意,这里是C++03 version。 -
@FiddlingBits,不,后者只能用数组的一个元素初始化。只要不修改其中的任何内容,前者仍然可以让您以任何您希望的方式遍历数组。或者它会编译。
-
只是对于那些想知道的人,后者 将 在类型排列时起作用,即,当
int *ptrarr[1]是const并初始化时:int data; int const *ptrarr[1]{&data}; int const * const (&why)[1] = ptrarr;按我预期编译会的。 -
您似乎遗漏的一个先决条件是
int const * (&rptrarr)[1](指针不是 const,但它指向的值是)。这也成功了吗?
标签: c++ arrays pointers reference constants