我在最新的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是一个无法完成的不完整类型;这样的类型有一组空值......
答案 0 :(得分:5)
“cv void”不是真正的类型。 “cv”这里是“可能cv-qualified”的简写,这意味着“可能有const
或volatile
”。
该段落意味着指向成员的指针可能不指向以下类型的对象:void
,const void
,volatile void
和const 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));