[英]What's the difference between void and cv void?
我在最新的C ++标准草案( N4606 )中遇到过类型“cv void” :
8.3.3 [dcl.mptr],第3段
指向成员的指针不应指向类(9.2.3)的静态成员,具有引用类型的成员或“cv void” 。
通过一些研究,我发现“cv void”是一个真实的类型 ,但我不知道与void类型相比有什么区别。 你能用一个例子 (可能带代码)解释一下吗?
编辑 :
3.9.1 [basic.fundamental],第9段
类型cv void是不完整的类型,无法完成; 这样的类型有一组空值...
“cv void”不是真正的类型。 “cv”这里是“可能是cv-qualified”的简写,这意味着“可能有一个const
或一个volatile
”。
该段落意味着指向成员的指针可能不指向以下类型的对象: void
, const void
, volatile void
和const volatile void
。 这是相当明显的,因为这些对象首先不存在,但我想很清楚。
我们并不“需要”允许void
被cv限定。 但是,允许它比制作一个禁止它的特殊例外更简单。
但它实际上确实有一个重要的实际用途:允许void
cv-qualified允许我们用指针到void
来编写cv-correct代码。
“cv void
”表示可选地为const
或volatile
标准化的void
。 简单void
并不合格。
出于某种原因,有人显然认为禁止成员指针是一个好主意(与普通指针相反)。
似乎有人不喜欢无类记忆...
为什么我们需要“
cv
-qualify”类型void
?
同样的原因你需要cv -qualify任何其他类型。 例如, 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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.