【发布时间】:2017-01-12 23:47:15
【问题描述】:
为什么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>?
【问题讨论】:
-
简短的回答是:因为这就是 C++ 的工作方式。类型是指向某物的指针。应用
const修饰符使其成为指向某物的常量指针。结束。 -
我想在胸前纹上你的家庭住址,不代表你不能搬家。
-
一个是指向可变对象的 const 指针,一个是指向 const 对象的可变指针
-
谢谢大家!我缺少的一点是
const T限定T为常数,在T被推导/替换之前。我错误地认为T被直接替换(像宏一样),而不是被视为自己的类型,有自己的限定符。 -
这就是为什么我更喜欢将
const放在它限定的类型之后。这样T const和T = int *就应该变成int * const。
标签: c++ arrays pointers constants type-deduction