使用和直接插入之间的区别

时间:2018-06-22 15:24:19

标签: c++ const using

考虑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并不等同于简单地“插入”类型然后解析该行。

使用using和直接“内联”类型之间还有更多区别吗?

2 个答案:

答案 0 :(得分:6)

解释上的差异是由于C ++声明处理指针常量性的方式所致,而后者是从C借用其语义的。基本上,const int* xint * const x的含义不同,as explained in this Q&A

反过来,这种解释是由于语法上“匿名”指针类型的派生方式所致:当const为时,语言设计者决定将const-ness分配给指向的值,而不是指针本身。在声明的前面。

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

typedef int* x;

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

实质上,添加usingtypedef会使C ++将int*视为单一类型,只有一种分配常量性的方式。另一方面,直接写入int*被视为“派生”指针类型,它受一组不同的规则支配。

答案 1 :(得分:1)

这与“东部常量”(位于右侧)/“西部常量”(位于左侧)有关。

左侧的

const仅在一个地方允许使用:类型声明的开头。规则是const在它适用的类型的右边。而且当它写在左边时,与它的类型右边一样。

所以:

const int i1;

int const i2;

是一样的。 (常量int)

并且:

const int* i3;

int const* i4;

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

但是对于using,我们的情况有所不同。

 const X i5;

 X const i6;

都一样。

所以当我们用X代替类型时,我们得到:

 int * const i6;

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

这是您要注意的。