c++ - Jenis penukaran antara const int * dan int * const
为情所困
为情所困 2017-05-16 13:31:16
0
1
900

const int *: Penunjuk itu sendiri boleh berubah, tetapi nilai yang ditunjuk adalah tidak berubah

int * const: Penunjuk itu sendiri tidak boleh diubah dan nilai yang ditunjuk boleh berubah

Menukar const int * -> int * const akan melaporkan ralat

Penukaran int * const -> const int * boleh dilakukan

Semantik bercakap, ia lebih mudah untuk difahami, tetapi dari sudut pandangan formal, kedua-duanya mempunyai kuantiti yang tidak berubah, jadi mengapa satu arah boleh dilaksanakan semasa penukaran, tetapi bukan yang lain? Selepas memikirkannya, mungkin kerana petunjuk dan nilai tidak berada pada tahap yang sama, tetapi saya tidak tahu bagaimana untuk menjelaskannya?

为情所困
为情所困

membalas semua(1)
过去多啦不再A梦

Anggap bahawa apa yang dibincangkan di sini ialah penukaran tersirat (serupa dengan static_cast):

Konst asas mematuhi penukaran kelayakan: jenis sasaran mestilah lebih layak. Iaitu, const hanya boleh lebih tetapi tidak kurang.

4.1 Penukaran standard ialah penukaran tersirat dengan makna terbina dalam Klausa 4 menyenaraikan set penuh penukaran tersebut.

4.4.1 Nilai jenis "penunjuk kepada cv1 T" boleh ditukar kepada nilai jenis "penunjuk kepada cv2 T" jika "cv2 T" lebih layak untuk cv daripada "cv1 T".

Peraturan const peringkat atas lebih rumit Untuk jenis kelas, sama ada ia boleh ditukar bergantung pada pembina penukaran dan fungsi penukaran. Untuk jenis bukan kelas, tiada perkara seperti penukaran const peringkat atas. Penukaran standard Klausa 4 tidak mengatakan apa-apa tentang kebolehan peringkat atasan.


Di sini kita membincangkan beberapa situasi yang melibatkan const peringkat atasan:

Ekspresi:

5.8 [...] [Nota: Oleh kerana cv-qualifier dialih keluar daripada jenis ungkapan jenis bukan kelas apabila ungkapan ditukar kepada prvalue, ungkapan lvalue jenis const int boleh, sebagai contoh, menjadi digunakan di mana ungkapan nilai jenis int diperlukan —nota akhir]

Tugasan:

3.10.1 [...] pengendali tugasan terbina dalam menjangkakan bahawa operan kiri ialah nilai dan bahawa operan kanan ialah nilai dan menghasilkan nilai sebagai hasilnya.

3.10.2 Apabila nilai gl muncul dalam konteks di mana nilai dijangka, nilai gl ditukar kepada nilai [...]

3.10.4 Nilai kelas boleh mempunyai jenis kelayakan cv; nilai nilai bukan kelas sentiasa mempunyai jenis tidak layak.

Permulaan:

8.5.16 [...] [ Nota: Ungkapan jenis "cv1 T" boleh memulakan objek jenis "cv2 T" secara bebas daripada cv-qualifiers cv1 dan cv2 [...]

Maksudnya, apabila yang diperlukan ialah prvalue, tiada const prvalue. Mengenai nilai gl, terdapat konvensyen berikut:

4.3 Ungkapan e boleh ditukar secara tersirat kepada jenis T jika dan hanya jika pengisytiharan T t=e terbentuk dengan baik, untuk sesetengah pembolehubah sementara ciptaan t (8.5).[...] Kesan sama ada tersirat; penukaran adalah sama seperti melakukan pengisytiharan dan permulaan dan kemudian menggunakan pembolehubah sementara sebagai hasil daripada penukaran Hasilnya ialah nilai jika T ialah jenis rujukan nilai atau rujukan nilai kepada jenis fungsi (8.3.2), nilai x. jika T ialah rujukan rnilai kepada jenis objek, dan nilai nilai sebaliknya Ungkapan e digunakan sebagai nilai gl jika dan hanya jika pemulaan menggunakannya sebagai nilai gl.

.

Perenggan ini menetapkan kategori nilai selepas penukaran tersirat. Apabila hasil penukaran tersirat ialah prvalue, tiada const dan apabila hasilnya adalah glvalue, jenis sasaran penukaran mestilah rujukan lvalue atau rujukan rvalue. Dalam kes ini, jika pemulaan berikut bertahan, ia boleh ditukar:

T &t = e;
T &&t = e;
const T &t = e;
const T &&t = e;

8.5.3.4 Memandangkan jenis "cv1 T1" dan "cv2 T2," "cv1 T1" adalah berkaitan rujukan dengan "cv2 T2" jika T1 adalah jenis yang sama dengan T2, atau T1 ialah kelas asas T2 "cv1 T1" adalah serasi rujukan dengan "cv2 T2" jika T1 berkaitan rujukan dengan T2 dan cv1 ialah kelayakan cv yang sama seperti, atau kelayakan cv yang lebih tinggi daripada, cv2.

serasi rujukan mengehadkan sama ada ia boleh dimulakan. Peraturan di sini adalah serupa dengan peraturan penukaran kelayakan. Selain itu, const ini sudah pun menjadi const yang mendasari.

PS: Terdapat nota kaki pada penukaran kelayakan: "Peraturan ini memastikan bahawa keselamatan const dipelihara oleh penukaran.". Semua penukaran const tersirat, sama ada yang dipersetujui atau khayalan, adalah baik asalkan boleh memastikan keselamatan const. Jika penukaran const memastikan keselamatan const, tetapi tidak boleh dilaksanakan kerana ia melanggar beberapa syarat lain, maka ini mungkin pil bahasa. kelakar

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan