我相信这可能适用于许多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不是参考兼容的。
答案 0 :(得分:7)
相同的部分,8.5.3 / 4(编号来自n3797,我可用)定义参考兼容:
指定类型“ cv1
更高的cv资格T1
”和“ cv2T2
,”“ cv1 {{1} }“与参考相关的 如果T1
与T2
的类型相同,则“ cv2T1
”,或T2
是基类T1
。 “ cv1T2
”参考兼容与“ cv2T1
”如果T2
是 与T1
和 cv1 相关的参考资料与cv资格相同,或者 比 cv2
所以你的类型T1是T2
和T2 int*
。它们不是同一类型。它们中的任何一个都不是另一个的基类(因为它们都不是一个类)。因此,它们与参考无关。
当标准说“cv1 T1”时,它表示将int const*
,const
中的0或更多应用于volatile
类型的任何类型。它不意味着文本替换,也就是说它并不意味着由0个或更多关键字T1
声明的任何类型,const
后跟另一个序列令牌,这是T1的类型声明。
所以你可能误解了这一点,以至于你认为volatile
是const int*
的cv合格版本。如果是,那么根据一般规则,它们将与参考相关,因此标准中需要有文本才能作出例外。但事实并非如此。 int*
是int *const
的cv限定版本。