【问题标题】:What's the difference between void and cv void?void 和 cv void 有什么区别?
【发布时间】:2016-10-09 17:25:48
【问题描述】:

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

8.3.3 [dcl.mptr],第 3 段

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

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


编辑

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

    3.9.1 [basic.fundamental],第 9 段

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

【问题讨论】:

  • const volatile void.
  • 更确切地说,void 带有 constvolatile 限定符。
  • cv 限定的 void 有什么意义?
  • @Il-seobBae 只是为了支持const void* p = &something;。例如。 void *memcpy(void *dest, const void *src, size_t n);.
  • @Il-seobBae 这一点也不奇怪。成员指针没有“空转义”。使用成员指针,您必须知道成员的确切类型。 C 没有成员指针,所以我们需要向后兼容 C 的论点在这里不适用。

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


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

我们“不需要”让void 具有 cv 资格。但是,允许它比创建一个特殊的例外来禁止它更简单。

但它确实有一个重要的实际用途:允许 void 具有 cv 限定允许我们编写带有指向 void 的指针的 cv 正确代码。

【讨论】:

    【解决方案3】:

    “cv void”表示void,可选const-或volatile-qualified。单纯的void不够格。

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

    【讨论】:

      【解决方案4】:

      为什么我们需要“cv-qualify”类型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)); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        • 2017-12-05
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 2017-05-02
        相关资源
        最近更新 更多