Mengapa Menggunakan Tanda Kurung Berganda dalam `decltype` Mengubah Jenis Terhasil?

Patricia Arquette
Lepaskan: 2024-10-31 11:15:29
asal
778 orang telah melayarinya

Why Does Using Double Parentheses in `decltype` Change the Resulting Type?

Type Deduction with Double Parentheses in decltype

Dalam C , kata kunci decltype boleh digunakan untuk menentukan jenis ungkapan. Apabila digunakan dengan kurungan berganda, ia menunjukkan tingkah laku halus yang boleh membawa kepada kekeliruan.

Masalah:

Pertimbangkan coretan kod berikut:

<code class="cpp">const int&&& foo();
int i;
struct A { double x; };
const A* a = new A();
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&</code>
Salin selepas log masuk

Mengapakah menambah kurungan pada a->x dalam baris keempat mengubah jenis yang terhasil daripada double kepada const double&?

Jawapan:

Penjelasan terletak pada peraturan untuk menyimpul jenis menggunakan decltype. Mengikut standard bahasa C:

  1. Jika e ialah pengecam yang tidak dikurung atau akses ahli kelas, decltype(e) mengembalikan jenis entiti yang dinamakan oleh e.
  2. Jika e ialah nilai l, decltype(e) mengembalikan T&, dengan T ialah jenis e.

Dalam contoh yang diberikan:

  • decltype(a->x) mentafsirkan a->x sebagai akses ahli kelas, menghasilkan jenis double.
  • decltype((a->x)) mentafsirkan (a->x) sebagai lvalue, menghasilkan a jenis const double&.

Oleh itu, menambah kurungan pada a->x menukar potongan jenis daripada jenis ahli yang diakses kepada rujukan kepada ahli itu sendiri.

Atas ialah kandungan terperinci Mengapa Menggunakan Tanda Kurung Berganda dalam `decltype` Mengubah Jenis Terhasil?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!