簡體   English   中英

const無效的意義何在?

[英]What's the point of const void?

顯然,可以聲明一個返回const void的函數:

const void foo()
{
}

g ++似乎認為const很重要,因為下面的代碼不能編譯:

#include <type_traits>

static_assert(std::is_same<void(), const void()>::value, "const matters");

那么const void有什么實際意義嗎?

並不是的。 但忽略對void的cv -qualifications或使它們出錯可能會在編譯器實現和最終用戶代碼方面產生不必要的復雜性。 考慮類似的模板

  template<typename T>
  const T ...

沒有理由在這種情況下使用void作為特殊情況(比現在更多),它只會造成頭痛。

此外,雖然const void沒有幫助,但const void*有其用途。

const void是允許的,因為沒有必要讓編譯器將一個例外的規則踢出一般規則,並且留下它沒有任何害處。

上面有一些討論, const void*不是很有用:

const void *有用嗎? 我可以看到void * const是怎樣的,但不是前者。 -Spidey

事實上, const void*有時是必不可少的。 它聲明被指向的東西只是讀取而不是void* const ,它只聲明指針本身是常量但不指向它指向的東西。

根據我的經驗,使用const void*指向常量的指針是兩種形式中更有用的。 當然,還有const void* const意味着指針和它指向的東西都是常量。

void*通常用作傳遞非特定指針的方法(例如,使用memcpy() )。 如果你想將一個const char*傳遞給這樣一個函數,那么你就不能使用void*或者你失去了它所指向的東西是不變的並且不能被改變的事實。 當前的C ++編譯器將拒絕編譯它,因為它必須隱式地將const掉,並且理所當然,因為這些數據可能在只讀內存中,並且如果有任何東西試圖寫入它可能會導致異常。

這就是為什么memcpy()的第二個參數是const void*而不是void*

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM