以下代码行编译得很好并且表现得很好:
listint_pointers; // (1)
以下两行不是:
typedef int * IntPtr; listint_pointers; // (2)
我得到完全相同的编译错误
listint_pointers; // (3)
我很清楚最后一行不合法,因为STL容器的元素需要可分配.为什么编译器解释(2)与(3)相同?
简短回答:
是一个指向常量int的指针列表.
是一个常量指针列表.
与2相同.
const(和volatile)应该在它们符合条件的类型之后自然出现.以前编写时,编译器会在内部自动重写它:
const int *
变
int const *
这是一个指向常量int的指针.这些列表将编译正常,因为指针本身仍可分配.
您从右到左阅读C风格的类型声明.所以"const int*"是一个指向常量int的指针("const int"和"int const"意思相同).那些是完全可分配的.但是(2)和(3)是int的常量指针,因此不可赋值.
您问"为什么编译器解释(2)与(3)相同?".好吧,因为在C++语言(以及C语言)中,它们在语义上是相同的.将typename定义为
typedef int *IntPtr;
然后类型const IntPtr
将代表int *const
,而不是const int *
.这就是typedef-names在C++中的工作方式.
C++中的Typedef-names不是宏.虽然它们没有定义新类型(只是现有类型的别名),但结果别名仍然是"原子","单片",在某种意义上,应用于别名的任何限定符都将应用为顶级限定符.当你使用typedef-name时,没有办法"偷偷摸摸"一个const限定符,以便它以某种方式"下降"到该类型的较低级别部分(int
在你的情况下).
如果你坚持使用typedef-names,你没有其他的直接选择,只能提供两个不同的typedef-names,比如
typedef int *IntPtr; typedef const int *ConstIntPtr;
并ConstIntPtr
在需要类型的指针到const版本时使用.
const IntPtr
并且const int*
是不一样的东西.
1)const int*
是"指针const int
".
2)const IntPtr
扩展到int * const
(思考(int *) const
)哪个是" const
指针int
".
简而言之,typedef
它就像一组括号.你不能改变const
什么的-ness typedef
"d指针指向.