void和cv void之间有什么区别?

时间:2016-10-09 17:25:49

标签: c++ c++11 language-lawyer

我在最新的C ++标准草案( N4606 )中遇到了类型“cv void”

  

8.3.3 [dcl.mptr],第3段

     

指向成员的指针不得指向类(9.2.3)的静态成员,具有引用类型的成员,或“cv void”

通过一些研究,我发现“cv void”是一个真正的类型,但我不知道与void 相比有什么区别。你能用一个例子(可能带代码)来解释吗?

编辑

  • 我预计cv会代表cv-qualified。我的问题是,为什么我们需要“cv-qualify”类型void?
  • 我之所以说“cv void是一个真正的类型”的原因是,标准实际上定义了它:
      

    3.9.1 [basic.fundamental],第9段

         

    类型cv void是一个无法完成的不完整类型;这样的类型有一组空值......

4 个答案:

答案 0 :(得分:5)

“cv void”不是真正的类型。 “cv”这里是“可能cv-qualified”的简写,这意味着“可能有constvolatile”。

该段落意味着指向成员的指针可能不指向以下类型的对象:voidconst voidvolatile voidconst volatile void。这是相当明显的,因为这些对象不可能首先存在,但我想很清楚。

答案 1 :(得分:4)

我们“不需要”允许void获得cv认证。但是,允许它比制作一个禁止它的特殊例外更简单。

但它确实具有重要的实际用途:允许void为cv-qualified,允许我们使用指针 - void编写cv-correct代码。

答案 2 :(得分:3)

" cv void"表示void,可选const - 或volatile - 合格。简单地void不是那么合格。

出于某种原因,有人显然认为禁止成员指针(与普通指针相比)是个好主意。
似乎有人不喜欢无类记忆...

答案 3 :(得分:2)

  

为什么我们需要" cv - 限定"类型void

您需要 cv - 限定任何其他类型的相同原因。例如,memcpy的签名是:

void* memcpy( void* dest, const void* src, std::size_t count );

src参数是指向const void的指针,因为src指向的内存不会被函数修改。这让我传入指向const对象的指针:

const POD pod{...};
POD new_pod;
memcpy(&new_pod, &pod, sizeof(pod));