Mengapa Tingkah Laku `decltype` Berubah dengan Tanda Kurung Berganda?

Mary-Kate Olsen
Lepaskan: 2024-11-05 08:46:02
asal
939 orang telah melayarinya

 Why Does `decltype` Behavior Change with Double Parentheses?

Aplikasi Lanjutan decltype

Dalam C , pengendali decltype ialah alat yang berkuasa untuk menentukan jenis ungkapan. Walaupun ia biasanya beroperasi seperti yang anda jangkakan, terdapat keadaan di mana penggunaan kurungan berganda boleh membuat perbezaan yang ketara.

Seperti yang dinyatakan dalam FCD (§7.6.1.2/4):

const int&&& foo();
int i;
struct A { double x; };
const A* a = new A();
Salin selepas log masuk

Pertimbangkan contoh berikut:

decltype(foo()) x1 = i;     // type is const int&&&
decltype(i) x2;             // type is int
decltype(a->x) x3;          // type is double
decltype((a->x)) x4 = x3;   // type is const double&
Salin selepas log masuk

Timbul persoalan: mengapa tanda kurung membuat perbezaan pada baris terakhir? Secara intuitif, seseorang mungkin menganggap bahawa ia sepatutnya dua kali ganda, serupa dengan baris di atas.

Walau bagaimanapun, FCD memberikan beberapa cerapan:

  • Jika e ialah ungkapan id yang tidak dikurung atau akses ahli kelas (5.2.5), decltype(e) ialah jenis entiti yang dinamakan oleh e.
  • Jika e ialah lnilai, decltype(e) ialah T&, dengan T ialah jenis e .

Dalam kes ini, decltype(a->x) ialah akses ahli kelas, dan oleh itu, x3 mempunyai jenis entiti yang dinamakan oleh a->x, iaitu dua kali ganda. Walau bagaimanapun, decltype((a->x)) ialah nilai l, dan oleh itu, x4 mempunyai jenis a->x, iaitu const double&.

Pembezaan ini adalah halus tetapi kritikal dalam memahami nuansa decltype. Dengan memanfaatkan kuasa kurungan berganda, pengaturcara boleh memanipulasi dan menentukan jenis dengan lebih ketepatan, membolehkan kod yang lebih mantap dan fleksibel.

Atas ialah kandungan terperinci Mengapa Tingkah Laku `decltype` Berubah dengan Tanda Kurung Berganda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan