Dan*_*ook 8 c++ containers stl typedef
以下代码行编译得很好并且表现得很好:
list<const int *> int_pointers; // (1)
Run Code Online (Sandbox Code Playgroud)
以下两行不是:
typedef int * IntPtr;
list<const IntPtr> int_pointers; // (2)
Run Code Online (Sandbox Code Playgroud)
我得到完全相同的编译错误
list<int * const> int_pointers; // (3)
Run Code Online (Sandbox Code Playgroud)
我很清楚最后一行不合法,因为STL容器的元素需要可分配.为什么编译器解释(2)与(3)相同?
简短回答:
const(和volatile)应该在它们符合条件的类型之后自然出现.以前编写时,编译器会在内部自动重写它:
const int *
Run Code Online (Sandbox Code Playgroud)
变
int const *
Run Code Online (Sandbox Code Playgroud)
这是一个指向常量int的指针.这些列表将编译正常,因为指针本身仍可分配.
您从右到左阅读C风格的类型声明.所以"const int*"是一个指向常量int的指针("const int"和"int const"意思相同).那些是完全可分配的.但是(2)和(3)是int的常量指针,因此不可赋值.
您问"为什么编译器解释(2)与(3)相同?".好吧,因为在C++语言(以及C语言)中,它们在语义上是相同的.将typename定义为
typedef int *IntPtr;
Run Code Online (Sandbox Code Playgroud)
然后类型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;
Run Code Online (Sandbox Code Playgroud)
并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指针指向.
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |