首頁 > 後端開發 > C++ > 主體

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

Patricia Arquette
發布: 2024-10-31 11:15:29
原創
777 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!