T* and const T*

T* and const T*

本文关键字:const and      更新时间:2023-10-16

我相信这可能适用于许多T,但我肯定知道这适用于整数。作为学习C++的一部分,我试图用标准中的语言来解释以下行为。

typedef const int * constintptr;
typedef int * intptr;
intptr p;
constintptr cp = p;
const constintptr& crcp = p;
//constintptr & rcp = p;

从查看 n3337,第 8.5.3 节。 似乎这种行为可以通过说 int* 可转换为 const int * prvalue 来解释,但不兼容引用。(如果我错了,请纠正我)。

我看到这是可取的行为(或者我们可以颠覆常量),而这种行为的可取性不是这个问题的内容。

问题是在标准中指定(或暗示)它们的 intptr 和 consintptr 不兼容引用。

同一部分,8.5.3/4(从 n3797 中编号,我可用)定义了引用兼容:

给定类型">cv1T1"和">cv2T2",">cv1T1"与">cv2T2"的引用相关,如果T1T2的类型相同,或者T1T2.">cv1T1"与 ">cv2T2"的引用兼容,如果T1T2相关的参考文献和CV1与 CV 资格相同,或 简历资格高于CV2

所以你有类型 T1 是int*和 T2int const*.它们不是同一类型。它们都不是另一个的基类(因为两者都不是类)。因此,它们与引用无关。

当标准说"cv1 T1"时,它表示任何类型是应用 0 或更多const的结果,volatileT1类型。它并不意味着文本替换,也就是说,它不意味着由 0 或多个关键字const声明的任何类型,volatile后跟另一个标记序列,该标记序列是 T1 的类型声明。

因此,您可能误解了这一点,以至于您认为const int*int*的简历合格版本。如果是,那么根据一般规则,它们将与参考文献相关,因此标准中需要有文本来做出例外。但事实并非如此。int *const是符合 CV 标准的int*版本。