代码之家  ›  专栏  ›  技术社区  ›  Dan Hook

typedef和const指针的容器

  •  8
  • Dan Hook  · 技术社区  · 16 年前

    下面的代码行编译得很好,并且表现得很好:

    list<const int *> int_pointers;  // (1)
    

    以下两行没有:

    typedef int * IntPtr;
    list<const IntPtr> int_pointers;  // (2)
    

    我得到的编译错误与

    list<int * const> int_pointers;  // (3)
    

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

    6 回复  |  直到 15 年前
        1
  •  9
  •   bltxd    16 年前

    简短回答:

    1. 是指向常量int的指针列表。
    2. 是指向int的常量指针列表。
    3. 与2相同。

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

    const int *
    

    变成

    int const *
    

    它是指向常量int的指针。由于指针本身仍然是可分配的,因此这些常量int的列表将编译得很好。

        2
  •  8
  •   Pontus Gagge    16 年前

    从右向左读取C样式类型声明。所以“const int*”是指向常量int的指针(“const int”和“int const”的意思相同)。这些是完全可以分配的。但是(2)和(3)是指向int的常量指针,因此不可赋值。

        3
  •  6
  •   AnT stands with Russia    16 年前

    您在问“为什么编译器解释(2)与(3)相同?”因为,在C++语言中(以及在C语言中) 是 语义相同。当您将一个类型名定义为

    typedef int *IntPtr;
    

    后来的类型 const IntPtr 将代表 int *const 不是为了 const int * . 这就是TyPulf名称如何在C++中工作。

    C++中的TyPulf名称不是宏。虽然它们不定义新类型(只是现有类型的别名),但结果别名仍然是“原子的”、“整体的”,从某种意义上说,应用于别名的任何限定符都将应用为 顶层 限定词。当使用typedef名称时,无法“潜入”const限定符,以便它以某种方式“下降”到类型的较低级别部分。( int 在你的情况下)。

    如果您坚持使用typedef名称,那么除了提供两个不同的typedef名称外,您没有其他直接选择,例如

    typedef int *IntPtr;
    typedef const int *ConstIntPtr;
    

    使用 ConstIntPtr 当需要指向类型的常量版本的指针时。

        4
  •  5
  •   Mike DeSimone    16 年前

    const IntPtr 和 const int* 不是一回事。

    1) const int * 是“指针” const int “。

    2) 康斯坦特 扩展到 int * const (思考 (int *) const 这就是“ const 指针指向 int “。

    简而言之, typedef 就像一组括号。你不能改变 康斯特 是什么? 类型定义 'd指针指向。

        5
  •  3
  •   gregseth    16 年前

    const int * 和写作一样 int const * ,表示由非常量指针指向的常量值。

    对于typedef,您将指针本身定义为常量,就像在第3条语句中那样。

        6
  •  0
  •   MarcH rhardih    15 年前

    我相信你知道 const IntPtr 和 IntPtr const 是同一类型。 这意味着什么 list<const IntPtr> 和 list<IntPtr const> 是同一类型。 这意味着您正在尝试编译:

    typedef int * IntPtr;
             list<IntPtr const> int_pointers;  // (2bis)