首頁  >  文章  >  後端開發  >  為什麼在 `decltype` 中使用雙括號會改變結果類型?

為什麼在 `decltype` 中使用雙括號會改變結果類型?

Patricia Arquette
Patricia Arquette原創
2024-10-31 11:15:29779瀏覽

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

decltype 中雙括號的型別推導

在 C 中, decltype 關鍵字可用來決定表達式的型別。當與雙括號一起使用時,它會表現出一種微妙的行為,可能會導致混亂。

問題:

考慮以下程式碼片段:

<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>

為什麼第四行的a->x 加號括號後結果類型會從double 變成const double&?

答案:

解釋在於使用decltype 推導類型的規則。根據 C 語言標準:

  1. 如果 e 是不帶括號的標識符或類別成員訪問,則 decltype(e) 傳回 e 命名的實體的類型。
  2. 如果 e是一個左值,decltype(e) 傳回 T&,其中 T 是 e 的型別。

在給定的例如:

  • decltype(a->x) 將 a->x 解釋為類別成員訪問,從而得到 double 類型。
  • decltype((a->x) ;x)) 將(a->x) 解釋為左值,從而產生const 類型double&.

因此,向a- >x 新增括號會將類型推導從存取的成員類型變更為對成員本身的參考。

以上是為什麼在 `decltype` 中使用雙括號會改變結果類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn