3

从 (4.4/1 ) 它读取

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

我不知道标准在哪里定义了“更多 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;
4

3 回答 3

5

3.9.3/4 中的表 6 给出了 cv-qualifiers 的部分排序,3.9.3/4 还给出了更多 cv-qualified的定义。

  • 没有 cv 限定符<const
  • 没有 cv 限定符<volatile
  • 没有 cv 限定符<const volatile
  • const<const volatile
  • volatile<const volatile
于 2011-09-29T09:59:45.063 回答
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
于 2011-09-29T09:57:55.547 回答
2

我不知道标准在哪里定义了“更多 cv-qualifield”类型

这是§3.9.3/4

对 cv 限定符有(部分)排序,因此可以说一种类型比另一种更具有 cv 限定。表 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
于 2011-09-29T10:02:18.143 回答