Apa itu const void?

89

Deskripsi std::is_voidmenyatakan 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 voidtipe pengembalian tidak valid (namun dikompilasi pada VC ++ 2015)

const void foo() { }

Jika menurut standar, const voidtidak valid (VC salah) - lalu apa const void?

Ajay
sumber
15
Jawaban yang Anda tautkan tidak menyatakan bahwa itu tidak valid, itu menyatakan bahwa itu akan "tidak berarti", yang saya maksudkan "tidak menawarkan manfaat apa pun lebih dari voidtanpa const".
@hvd, jawabannya menyatakan bahwa compiler harus memperingatkan / error tentang kualifikasi tersebut. Oleh karena itu saya menganggap standar C ++ tidak mengizinkan kualifikasi denganvoid
Ajay
2
Jawabannya menyatakan bahwa compiler harus memperingatkan tentang kualifikasi tersebut, tidak menyebutkan kesalahan, dan kesalahan akan menjadi salah. Komentar itu hanya tentang kualitas implementasi, bukan tentang kesesuaian, tetapi saya dapat memahami bahwa itu sama sekali tidak jelas dari ucapan itu sendiri.
@Ajay standar tidak menetapkan bahwa harus ada peringatan ketika Anda menggunakan kode yang tidak berarti. Itu adalah keputusan gcc untuk memberi Anda petunjuk tambahan bahwa kode ini tidak melakukan apa-apa. Tapi VC tidak salah sama sekali.
pengguna1942027
3
@Ajay Jawabannya menyatakan bahwa dentang memberikan peringatan, dan bahwa, menurut penulis, kompiler lain harus melakukannya. Jika standar tidak mengizinkannya, itu akan menjadi kesalahan, bukan peringatan.
molbdnilo

Jawaban:

94

const voidadalah tipe yang Anda dapat membentuk penunjuk. Ini mirip dengan void pointer normal, tetapi konversi bekerja secara berbeda. Misalnya, a const int*tidak dapat secara implisit diubah menjadi a void*, tetapi dapat secara implisit diubah menjadi a const void*. Demikian juga, jika Anda memiliki a, const void*Anda tidak static_castdapat melakukannya int*, tetapi Anda dapat static_castmelakukannya ke a const 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
Benjamin Lindley
sumber
4
Meskipun jawaban Anda bagus, itu tidak menyatakan alasannya const void, tetapi semua di sekitar petunjuk kosong dan tidak kosong [dengan (non-) konstan].
Ajay
26
@Ajay: Saya tidak setuju. A const void*adalah satu-satunya alasan yang pernah Anda lihat const void. Ini mungkin diteruskan sebagai argumen template, tapi tipe argumen itu hanya akan dibuat dengan a *di akhir.
Benjamin Lindley
@BenjaminLindley Anda juga dapat melihat const voiddi pertanyaan yang diajukan oleh pengacara bahasa
cpplearner
3
@Ajay: Pada titik tertentu pertanyaan ini menjadi pertanyaan filosofi. "Alasannya" const voidadalah semua tipe di C ++ bisa dibuat const. Itu "ada" dengan cara yang sama seperti yang voidada. Jawaban @Benjamin Lindley menjelaskan apa itu dengan cara Anda melihatnya dan bagaimana Anda menggunakannya.
Chris Beck
23

As void, const voidadalah tipe void. Namun, jika const voidmerupakan tipe kembalian , maka consttidak ada artinya (meskipun legal!), Karena [expr] / 6 :

Jika sebuah prvalue awalnya memiliki tipe " cv T ", di mana Tnon-class tidak memenuhi syarat cv, tipe non-larik, jenis ekspresi disesuaikan Tsebelum analisis lebih lanjut.

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 ke void*, tetapi void const*.

Columbo
sumber
const voidkarena tipe kembalian memengaruhi tipe fungsi, jadi ini tidak sepenuhnya tidak berarti.
cpplearner
1
@cpplearner Kecuali dalam segala hal praktis, karena baik tanda tangan fungsi maupun jenis pemanggilannya tidak terpengaruh.
Columbo
Yah itu bisa mengubah tanda tangan dari template fungsi. +1 tetap
cpplearner
@cpplearner Cukup adil - meskipun demikian, masih ada penekanan tombol yang sia-sia.
Columbo
Kita biasanya melihat: const int * tidak dapat menjadi void *, tetapi const void *.
mgouin
18

Jenis dapat menjadi hasil template; template mungkin menyatakan const T, dan dipakai dengan Tas void.

Jawaban yang ditautkan menyesatkan, atau lebih tepatnya, terbatas dalam pandangan yang berkaitan dengan kasus khusus dari jenis non-template, dan bahkan const voidmungkin tidak ada artinya , tetapi ini adalah kode yang valid .

DevSolar
sumber