[英]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.