Deskripsi std::is_void
menyatakan bahwa:
Memberikan nilai konstanta anggota yang sama dengan true, jika T adalah tipe void, const void, volatile void, atau const volatile void.
Lalu apa yang bisa const void
, atau volatile void
?
Jawaban ini menyatakan bahwa const void
tipe pengembalian tidak valid (namun dikompilasi pada VC ++ 2015)
const void foo() { }
Jika menurut standar, const void
tidak valid (VC salah) - lalu apa const void
?
void
tanpaconst
".void
Jawaban:
const void
adalah tipe yang Anda dapat membentuk penunjuk. Ini mirip dengan void pointer normal, tetapi konversi bekerja secara berbeda. Misalnya, aconst int*
tidak dapat secara implisit diubah menjadi avoid*
, tetapi dapat secara implisit diubah menjadi aconst void*
. Demikian juga, jika Anda memiliki a,const void*
Anda tidakstatic_cast
dapat melakukannyaint*
, tetapi Anda dapatstatic_cast
melakukannya ke aconst int*
.const int i = 10; void* vp = &i; // error const void* cvp = &i; // ok auto ip = static_cast<int*>(cvp); // error auto cip = static_cast<const int*>(cvp); // ok
sumber
const void
, tetapi semua di sekitar petunjuk kosong dan tidak kosong [dengan (non-) konstan].const void*
adalah satu-satunya alasan yang pernah Anda lihatconst void
. Ini mungkin diteruskan sebagai argumen template, tapi tipe argumen itu hanya akan dibuat dengan a*
di akhir.const void
di pertanyaan yang diajukan oleh pengacara bahasaconst void
adalah semua tipe di C ++ bisa dibuatconst
. Itu "ada" dengan cara yang sama seperti yangvoid
ada. Jawaban @Benjamin Lindley menjelaskan apa itu dengan cara Anda melihatnya dan bagaimana Anda menggunakannya.As
void
,const void
adalah tipe void. Namun, jikaconst void
merupakan tipe kembalian , makaconst
tidak ada artinya (meskipun legal!), Karena [expr] / 6 :Namun, ini adalah tipe yang valid dan terjadi di misalnya fungsi pustaka standar C , di mana ini digunakan untuk memastikan ketepatan konstanta dari pointer argumen:
int const*
tidak dapat dikonversi kevoid*
, tetapivoid const*
.sumber
const void
karena tipe kembalian memengaruhi tipe fungsi, jadi ini tidak sepenuhnya tidak berarti.Jenis dapat menjadi hasil template; template mungkin menyatakan
const T
, dan dipakai denganT
asvoid
.Jawaban yang ditautkan menyesatkan, atau lebih tepatnya, terbatas dalam pandangan yang berkaitan dengan kasus khusus dari jenis non-template, dan bahkan
const void
mungkin tidak ada artinya , tetapi ini adalah kode yang valid .sumber