考虑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
和直接“内联”类型之间还有更多区别吗?
答案 0 :(得分:6)
解释上的差异是由于C ++声明处理指针常量性的方式所致,而后者是从C借用其语义的。基本上,const int* x
和int * 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;
}
实质上,添加using
或typedef
会使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的常量指针。
这是您要注意的。