T *和const T *

时间:2014-01-04 00:20:47

标签: c++ pointers c++11 const

我相信这可能适用于许多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,但不兼容引用。 (如果我错了,请纠正我)。

我看到这是理想的行为(或者我们可以颠覆const),这种行为的可取性不是这个问题的意思。

问题是在标准中指定(或暗示)它们的intptr和constintptr不是参考兼容的。

1 个答案:

答案 0 :(得分:7)

相同的部分,8.5.3 / 4(编号来自n3797,我可用)定义参考兼容:

  

指定类型“ cv1 T1”和“ cv2 T2,”“ cv1 {{1} }“与参考相关的   如果T1T2的类型相同,则“ cv2 T1”,或T2是基类   T1。 “ cv1 T2参考兼容与“ cv2 T1”如果T2是   与T1 cv1 相关的参考资料与cv资格相同,或者   比 cv2

更高的cv资格

所以你的类型T1是T2和T2 int*。它们不是同一类型。它们中的任何一个都不是另一个的基类(因为它们都不是一个类)。因此,它们与参考无关。

当标准说“cv1 T1”时,它表示将int const*const中的0或更多应用于volatile类型的任何类型。它意味着文本替换,也就是说它并不意味着由0个或更多关键字T1声明的任何类型,const后跟另一个序列令牌,这是T1的类型声明。

所以你可能误解了这一点,以至于你认为volatileconst int*的cv合格版本。如果是,那么根据一般规则,它们将与参考相关,因此标准中需要有文本才能作出例外。但事实并非如此。 int*int *const的cv限定版本。