const资格转换

时间:2011-09-29 09:54:34

标签: c++ const implicit-conversion qualifiers

从(4.4 / 1)开始

  

“指向cv1 T的指针”类型的右值可以转换为rvalue   如果“cv2 T”比“cv1 T”更符合cv,则键入“指向cv2 T的指针”。

我不知道标准在哪里定义'more cv-qualifield'类型,但据我所知,const的声明符比非const更符合cv。

对于以下转换,标准的引用如何适用或如何知道哪一个更少或更多cv-qualifed?

int *const c1 = 0;
int const* c2 = 0;
const int *const c3 = 0;

c1 = c2; // allowed
c1 = c3; // allowed

更新

c2 = c1;
c2 = c3;

3 个答案:

答案 0 :(得分:5)

3.9.3 / 4中的表6给出了cv限定符的部分顺序,3.9.3 / 4也给出了更多cv-qualified 的定义。

  • 没有cv-qualifier < const
  • 没有cv-qualifier < volatile
  • 没有cv-qualifier < const volatile
  • const< const volatile
  • volatile< const volatile

答案 1 :(得分:4)

由于c1const指针变量(与指向常量数据的指针不同),因此无法修改它。因此,这两项任务都是非法的。

标准所指的是这种情况:

int *d1 = 0;
const int* d2 = d1; // d2 is more cv-qualified than d1
const volatile int* d3 = d1; // d3 is more cv-qualified than d2

答案 2 :(得分:2)

  

我不知道标准在哪里定义'more cv-qualifield'类型

§3.9.3/ 4

  

cv-qualifiers有一个(部分)排序,因此一个类型可以说比另一个类型更多cv-qualified 。表6显示了构成这种排序的关系。

     

表6-关于const和volatile的关系

     
no cv-qualifier  <  const  
no cv-qualifier  <  volatile   
no cv-qualifier  <  const volatile   
const            <  const volatile   
volatile         <  const volatile  

即,

  • const T 更符合cv资格而不是T
  • volatile T 更符合cv资格而不是T
  • const volatile T 更符合cv资格而不是T
  • const volatile T 更符合cv资格而不是const T
  • const volatile T 更符合cv资格而不是volatile T