const传播到std ::指针数组

时间:2016-09-05 15:09:10

标签: c++ arrays pointers const type-deduction

为什么std::array的数据类型在这里以不同方式实例化

using T = const int *;
std::array<T, 4> x = { &a, &b, &c, &d }; // name: class std::array<int const *,4>
x[0] = &c; // OK    : non-constant pointer
*x[0] = c; // Error : constant data

与此相比?

using T = int *;
std::array<const T, 4> x = { &a, &b, &c, &d }; // name: class std::array<int * const,4>
x[0] = &c; // Error : constant pointer
*x[0] = c; // OK    : non-constant data

第二种情况等同于const std::array<T, 4>(非常数数据的常量指针)。 如果我们直接使用const int *std::array<const int*, 4>我们会得到第一个案例行为。

更准确地说,为什么using T = int*; std::array<const T, 4>;等同于std::array<int*const, 4>而不是std::array<const int*, 4>

2 个答案:

答案 0 :(得分:5)

  

为什么using T = int*; std::array<const T, 4>;相当于std::array<int*const, 4>而不是std::array<const int*, 4>

因为constT上是合格的,指针本身在指针对象上没有(并且不能)。所以const T表示const指针,而不是指向const的指针。

规则是相同的,T是否为指针。

using T = int;   // const T => int const
using T = int*;  // const T => int* const, not int const*
using T = int**; // const T => int** const, neither int* const*, nor int const**

注意第三个例子,如果const在指针对象上是合格的,const T应该是int* const*,或者它应该在指针对象上被限定,即int const**

答案 1 :(得分:0)

using T = const int *; //T is a pointer to a CONSTANT integer.
std::array<T, 4> x = { &a, &b, &c, &d }; //array of PointerToConstantInteger, size=4

更改数组x的元素,但不要取消引用并尝试更改存储在其中的值。

using T = int *;  //T is a pointer to an integer.
std::array<const T, 4> x = { &a, &b, &c, &d }; //array of CONSTANT IntegerPointer, size=4

无法更改数组x的元素,但在解除引用和更改存储在其中的值时没有问题。