C++ T*和常数T*
我相信这可能适用于许多T,但我确信这适用于整数。作为学习C++的一部分,我试图用标准中的语言解释以下行为。C++ T*和常数T*,c++,pointers,c++11,constants,C++,Pointers,C++11,Constants,我相信这可能适用于许多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*prv
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和CONTINTPTR不兼容参考。同一节,8.5.3/4(n3797中的编号,我已提供)定义了兼容参考:
给定类型“cv1T1
”和“cv2T2
”,“cv1T1
”与参考相关
如果T1
与T2
的类型相同,或者T1
是
T2
。如果T1
是,则“cv1T1
”与“cv2T2
”是参考兼容的
与T2
和cv1相关的参考与相同的cv资格,或
cv资格比cv2更高
因此,类型T1是int*
和T2int const*
。它们不是同一类型。它们都不是另一个的基类(因为它们都不是类)。因此,它们与参考文献无关
当标准上说“cv1 T1”时,它是指对类型T1
应用0或更多的const
,volatile
。它并不意味着文本替换,也就是说,它并不意味着由0个或多个关键字const
,volatile
后跟另一个标记序列(T1的类型声明)声明的任何类型
因此,您可能误解了这一点,认为
const int*
是int*
的cv限定版本。如果是,则根据一般规则,它们将与引用相关,因此需要在标准中有文本来例外。但事实并非如此int*const
是int*
的cv限定版本,我认为这很直截了当:p
不是类型constintptr
的值。你可以转换它,这会产生一个临时值,从而产生一个右值,但右值不会绑定到左值引用。我认为,唯一与引用兼容的是一些常见继承层次结构中的派生类。我的问题是,基本上,标准是否提到int*和int const*(或其他类型)除了转换之外,没有任何特殊类型的关系?@orm:你的意思是,标准中有没有单独的一节说,“根据8.5.3中的定义,以下类型对与引用无关:”后面是一个完整的示例列表,包括“const int*
和int*
”。我对此表示怀疑。本标准确实包含示例来说明其规则,但除此之外,说明定义中已经涵盖的特定情况是多余的。不是8.5.3的结果,只是一般情况。这就是我的意思。在你的推理中:“它们不是同一类型。它们中的任何一个都不是另一个的基类。”它们不是彼此的基类的句子,这一事实从何而来。我知道你不想那样。但这是具体规定吗?是因为他们不是班级吗?这是因为除非它说它们是相关的,否则它们就不是了吗?@orm:是的,它们不是类类型,因此肯定一个不是另一个的基础。如果“相关”的定义没有说它们是相关的,那么它们就不相关,这也是正确的。这就是定义的含义。在描述技术术语时,斜体文字(我在复制和粘贴这段引文时认为它丢失了)表示标准中的一个定义。@SteveJessop:Re“它们不是类类型,因此肯定一个不是另一个的基础”,对于正式术语,可以假设的很少,这些词的意思并不总是和它们听起来的一样。例如,与“base”一样,“most-derived”可能需要类类型,所以如果不是类类型,那么肯定不是,是吗?然而,在C++11§1.8/4中,人们发现“最派生类类型或非类类型的对象称为最派生对象”。最派生的形式上并不意味着任何基,甚至类类型。。。就这么说吧。