C++ const指向类型的指针、指向const的指针和用于讨论const的术语

C++ const指向类型的指针、指向const的指针和用于讨论const的术语,c++,terminology,constants,conventions,C++,Terminology,Constants,Conventions,我相信我已经找到了很多人对const感到困惑的部分原因,那就是术语“const-pointer”(const-pointer)似乎有点违反直觉,因为(即使是那些理解其微妙之处的人)在说的时候,似乎经常是指“指向const的指针”或: 然而,当解析时没有对约定的先验知识(例如新来者),在术语“const-pointer”中,可以解析“const”限定了“pointer”,因此期望它表示“const-pointer-to-type”或: 因此,我的问题是: “常量指针”是否被接受为“常量类型*”的术

我相信我已经找到了很多人对
const
感到困惑的部分原因,那就是术语“const-pointer”(const-pointer)似乎有点违反直觉,因为(即使是那些理解其微妙之处的人)在说的时候,似乎经常是指“指向const的指针”或:

然而,当解析时没有对约定的先验知识(例如新来者),在术语“const-pointer”中,可以解析“const”限定了“pointer”,因此期望它表示“const-pointer-to-type”或:

因此,我的问题是:

  • “常量指针”是否被接受为“
    常量类型*
    ”的术语,尽管它似乎用词不当
  • 如果是,讨论中提到的“指向类型的常量指针”或“
    type*const
    ”的常规术语是什么
  • 是-通常“const-pointer”是指指向const对象的指针,而不是一个-pointer-that-is-const,这可能是因为第一种情况更常见,所以可以理解为它指定较短的形式


    通常,对于指向类型的
    const指针,您可以这样说,也可以使用指示符:
    T*const
    。很少讨论这样的指针,因此据我所知,没有特别常见的表达式。

    是的,
    常量类型*foo
    通常称为常量指针

    这种常量之所以有个名字,是因为这种常量比另一种更粘。如果得到指向常量对象的指针,则无法将其转换为非常量对象。 但是如果你得到一个指针,它本身是常量,但指向一个可变对象,你也可以将它复制到一个可写字段


    最后,指向const的指针表示指向的对象是const。它不是,它可以更改,您只是拥有对象的只读视图。从这个意义上讲,constness应用于指针的范围比对象本身的范围更广。

    const是一个所谓的限定符。它符合接下来的条件

    在const type*var的情况下,这意味着type的值是const,因此它被称为const(ant)type指针

    在type*const-var的情况下,这意味着var的值是const,因此它被称为类型指针const(ant)


    请注意两者之间的细微差别。

    那么,在讨论中,您通常如何引用
    Type*const
    。@Catskul:通过拼写:“一个指针是const。”它的使用要少得多,所以说,繁琐的问题不是问题,整个问题与 const引用< /COD>和引用const >虽然C++中没有歧义(引用本身总是const),但它与英文不太匹配。因为两个答案都没有提到:因为指针是整数,它们几乎总是通过值或常量引用传递。这一点通常也适用于迭代器,因此“Type*const”@pmr并没有真正的理由,它不是英语的问题,而是约定的问题。使用较长的形式就可以了。“它符合接下来的条件。”在我看来,这正是使用“const-pointer”来表示“const-type-pointer”的错误所在。使用相同的规则,人们可能会认为在术语“常量指针”中,“常量”在术语中是“指针”的限定词,而事实上,它并没有。@catskul:这就是微妙之处。我个人并不觉得它令人困惑。@catskul:当有人使用const指针这个术语时,我会自动假定它是const类型的指针。但是当一个人表示类型指针常量时,他们应该使用术语指针常量(ant)。我知道有一个约定,现在,根据你的答案,约定是什么。我想说的是,在不了解约定的情况下,术语很容易被错误解析。“const”并不限定“接下来会发生什么”,因为“const Type*”与“Type const*”相同——在这种情况下,“const”在“*”之前。我个人更喜欢将const放在它所限定的右边,因为这是一致的——类型、指针、成员函数也是如此。我认为它是指向const'X'的指针。您还可以在windows API中看到这一点,例如,指向常量字符串的LPCSTR长指针。
      const Type * foo;
    
      Type * const foo;