当前位置:  开发笔记 > 编程语言 > 正文

typedef和const指针的容器

如何解决《typedef和const指针的容器》经验,为你挑选了4个好方法。

以下代码行编译得很好并且表现得很好:

list int_pointers;  // (1)

以下两行不是:

typedef int * IntPtr;
list int_pointers;  // (2)

我得到完全相同的编译错误

list int_pointers;  // (3)

我很清楚最后一行不合法,因为STL容器的元素需要可分配.为什么编译器解释(2)与(3)相同?



1> bltxd..:

简短回答:

    是一个指向常量int的指针列表.

    是一个常量指针列表.

    与2相同.

const(和volatile)应该在它们符合条件的类型之后自然出现.以前编写时,编译器会在内部自动重写它:

const int *

int const *

这是一个指向常量int的指针.这些列表将编译正常,因为指针本身仍可分配.



2> Pontus Gagge..:

您从右到左阅读C风格的类型声明.所以"const int*"是一个指向常量int的指针("const int"和"int const"意思相同).那些是完全可分配的.但是(2)和(3)是int的常量指针,因此不可赋值.



3> AnT..:

您问"为什么编译器解释(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版本时使用.



4> Mike DeSimon..:

const IntPtr并且const int*是不一样的东西.

1)const int*是"指针const int".

2)const IntPtr扩展到int * const(思考(int *) const)哪个是" const指针int".

简而言之,typedef它就像一组括号.你不能改变const什么的-ness typedef"d指针指向.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有