T*和const T*

orm*_*orm 4 c++ pointers const c++11

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

typedef const int * constintptr;
typedef int * intptr;

intptr p;
constintptr cp = p;
const constintptr& crcp = p;
//constintptr & rcp = p;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ste*_*sop 7

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

给定类型的" CV1 T1 "和" CV2 T2 "," CV1 T1 "是参考相关 于" CV2 T2 "如果T1是相同的类型T2,或者T1是一个基类的 T2." cv1 T1 " 与" cv2 " 引用兼容,如果与引用相关,并且cv1cv2相同,或者cv- qualified与cv2相同 T2T1T2

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

当标准说"CV1-T1"时,它指任何类型,它是施加0以上的结果const,volatile所述类型T1.它并不意味着文本替换,也就是说它不代表任何由0或更多关键字声明的类型const,volatile后跟另一个标记序列,它是T1的类型声明.

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

  • @SteveJessop:Re"它们不是类型,因此肯定不是另一类的基础",对正式术语的假设很少,其中单词并不总是意味着它们的声音.例如,与"基础"相同的情况可能是"大多数派生"必然需要类类型的东西,所以如果它不是类类型肯定不是那个,是吗?但是,在C++11§1.8/ 4中,人们发现"最派生类类型或非类类型的对象称为最派生对象".最正式的,并不是正式地暗示任何基础,甚至是阶级类型......只是说'. (2认同)