Rumah > pembangunan bahagian belakang > C++ > Mengapa Menggunakan Tanda Kurung Berganda dalam `decltype` Mengubah Jenis Terhasil?

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

Patricia Arquette
Lepaskan: 2024-10-31 11:15:29
asal
914 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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan