`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* x
和 int * 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;
}
本质上,添加 using
或 typedef
使 C++ 将 int*
视为单一类型,只有一种分配常量的方法。另一方面,直接写 int*
被视为 "derived" 指针类型,由一组不同的规则管理。
这与east-const(右边的const)/west-const(左边的const)问题有关。
const
on 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 的常量指针。
这是您必须注意的。
考虑 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* x
和 int * 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;
}
本质上,添加 using
或 typedef
使 C++ 将 int*
视为单一类型,只有一种分配常量的方法。另一方面,直接写 int*
被视为 "derived" 指针类型,由一组不同的规则管理。
这与east-const(右边的const)/west-const(左边的const)问题有关。
const
on 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 的常量指针。
这是您必须注意的。