`using` 和直接插入的区别

difference between `using` and plugging in directly

考虑 2 个片段:

using x = int*;

int main () {
  const x a = new int(3);
  *a = 5;
}

int main () {
  const int* a = new int(3);
  *a = 5;
}

第一个编译,而第二个不编译

--> using 不等同于简单地 "plugging in" 类型然后解析行。

直接使用using和"inlining"类型有更多区别吗?

解释上的差异是由于 C++ 声明处理指针常量的方式,它借鉴了 C 的语义。基本上,const int* xint * const x 表示不同的东西,as explained in this Q&A.

反过来,这种解释是由于 "anonymous" 指针类型在句法上的派生方式:语言设计者决定将常量分配给指向的值,而不是指针本身,当 const在声明的前面。

请注意,当您 typedef 指针类型时会发生同样的事情:

typedef int* x;

int main () {
    const x a = new int(3);
    *a = 5; // Works fine
    return 0;
}

本质上,添加 usingtypedef 使 C++ 将 int* 视为单一类型,只有一种分配常量的方法。另一方面,直接写 int* 被视为 "derived" 指针类型,由一组不同的规则管理。

这与east-const(右边的const)/west-const(左边的const)问题有关。

conston left 只允许出现在一个地方:在类型声明的开头。规则是 const 位于它所应用的类型的右侧。当它写在左边时,它和写在右边的类型是一样的。

所以:

const int i1;

int const i2;

是一样的。 (常量整数)

并且:

const int* i3;

int const* i4;

是一样的。 (指向常量 int 的指针)

但是 using 我们的情况就不同了。

 const X i5;

 X const i6;

都一样。

所以当我们用 X 替换我们得到的类型时:

 int * const i6;

这是一个指向(非常量)int 的常量指针。

这是您必须注意的。