从(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;
答案 0 :(得分:5)
3.9.3 / 4中的表6给出了cv限定符的部分顺序,3.9.3 / 4也给出了更多cv-qualified 的定义。
const
volatile
const volatile
const
< const volatile
volatile
< const volatile
答案 1 :(得分:4)
由于c1
是const
指针变量(与指向常量数据的指针不同),因此无法修改它。因此,这两项任务都是非法的。
标准所指的是这种情况:
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
。