为什么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,&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>我们得到第一个案例行为.
更确切地说,为什么使用T = int *; std :: array< const T,4> ;;相当于std :: array< int * const,4>而不是std :: array< const int *,4>?
解决方法
why is
using T = int*; std::array<const T,4>;
equivalent tostd::array<int*const,4>
and notstd::array<const int*,4>
?
因为const在T,指针本身上是合格的,所以它不是(并且不能)在指针上合格.因此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 *,或者它应该在pointee的指针对象上是合格的,即int const **?