Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ T*和常数T*_C++_Pointers_C++11_Constants - Fatal编程技术网

C++ T*和常数T*

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

我相信这可能适用于许多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和CONTINTPTR不兼容参考。

同一节,8.5.3/4(n3797中的编号,我已提供)定义了兼容参考:

给定类型“cv1
T1
”和“cv2
T2
”,“cv1
T1
”与参考相关 如果
T1
T2
的类型相同,或者
T1
T2
。如果
T1
是,则“cv1
T1
”与“cv2
T2
”是参考兼容的 与
T2
和cv1相关的参考与相同的cv资格,或 cv资格比cv2更高

因此,类型T1是
int*
和T2
int 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中,人们发现“最派生类类型或非类类型的对象称为最派生对象”。最派生的形式上并不意味着任何基,甚至类类型。。。就这么说吧。