常量资格转换

3

来自 (4.4/1 ) 的内容:

如果“cv2 T”比“cv1 T”更具cv限定性,则类型为“指向cv1 T”的右值可以转换为类型为“指向cv2 T”的右值。

我不知道标准在哪里定义了“更具cv限定性”的类型,但是据我所理解,带有const的声明符比无const的声明符更具cv限定性。

对于以下转换,如何适用标准中的引用,或者您如何知道哪一个具有更少或更多的cv限定性?

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

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

更新:

c2 = c1;
c2 = c3;
3个回答

5

3.9.3/4中的表6给出了cv限定符的部分排序信息,3.9.3/4还给出了“更多cv限定符”的定义。

  • 没有cv限定符 < const
  • 没有cv限定符 < volatile
  • 没有cv限定符 < const volatile
  • const < const volatile
  • volatile < const volatile

这是否意味着我示例中的转换未被标准规定? - cpx
@cpx:这意味着它们不被允许,因为int不比const int更具有cv限定性,并且您不能简单地以4.4./4允许的方式添加const。如果允许转换,您仍然无法分配给c1,因为c1const(无论所指向的类型的cv限定性如何)。 - CB Bailey
1
@cpx:后编辑:赋值c2 = c3;是合法的,因为类型相同(除了顶层const),而赋值c2 = c1;也是合法的,因为const intint更具cv限定性。不过我只是为您阅读规范。 - CB Bailey
@CharlesBailey:谢谢。虽然我知道转换是有效的,但当我打开规范时,它让我产生了疑问。 - cpx

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

我不知道标准中对“更多cv限定类型”做了什么定义。

它在§3.9.3/4中有说明。

There is a (partial) ordering on cv-qualifiers, so that a type can be said to be more cv-qualified than another. Table 6 shows the relations that constitute this ordering.

Table 6—relations on const and volatile


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

也就是说,

  • const TT 更加cv限定
  • volatile TT 更加cv限定
  • const volatile TT 更加cv限定
  • const volatile Tconst T 更加cv限定
  • const volatile Tvolatile T 更加cv限定

这是否意味着我示例中的转换未被标准指定?即在int *const to int const*中,哪个是更cv-qualified的,或者我们如何得出转换将是有效的想法? - cpx
1
@cpx:int * constint const*更多的cv限定符方面是不可比较的,因为int * const表示指针是const(即Tint *),而int const*表示数据是const(即Tint)。在每种情况下,const-ness应用于不同的对象;每种情况下的T是不同的。 - Nawaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接