C 中關鍵字auto和decltype的區別

2021-08-14 05:53:52 字數 843 閱讀 2680

c++11標準引入了auto和decltype型別說明符,它能讓編譯器幫我們去分析表示式所屬的型別。

auto和decltype的主要區別有三個方面:

第一,auto型別說明符用編譯器計算變數的初始值來推斷其型別,而decltype雖然也讓編譯器分析表示式並得到它的型別,但是不實際計算表示式的值。

第二,編譯器推斷出來的auto型別有時候和初始值的型別並不完全一樣,編譯器會適當地改變結果型別使其更符合初始化規則。例如,auto一般會忽略頂層const,而把底層const保留下來。與之相反,decltype會保留變數的頂層const。

第三,與auto不同,decltype的結果型別與表示式形式密切相關,如果變數名加上了一對括號,則得到的型別與不加括號時會有不同。如果decltype使用的是乙個不加括號的變數,則得到的結果就是該變數的型別;如果給變數加上了一層或多層括號,則編譯器將推斷得到引用型別。

舉例:

#include 

#include

using

namespace

std;

int main()

對於第一組型別推斷來說,a是乙個非常量整數,c1的推斷結果就是整數,c2的推斷結果也是整數,c3的推斷結果由於變數a額外加了一對括號所以是整數引用。c1、c2、c3依次執行自增操作,因為c3是變數a的別名,所以c3自增等同於a自增,最終c1、c2、c3的值都變為4。

對於第二組型別推斷來說,d是乙個常量整數,含有頂層const,使用auto推斷型別自動忽略掉頂層const,因此f1的推斷結果是整數;decltype則保留頂層const,所以f2的推斷結果是整數常量。f1可以正常執行自增操作,而常量f2的值不能被改變,所以無法自增。

C 中,auto 關鍵字

在函式返回值 range for 等情況中 1 auto使用有5種用法 auto 拷貝 auto 左值引用,只能接左值 和常量右值 auto 萬能引用,能接左值和右值 const auto const 萬能引用,能接左值和右值 const auto 常量右值引用,只能接右值 很多人直接就寫成 aut...

c 中的auto關鍵字

auto等同於c 的var。從其初始表示式推斷宣告的變數的型別。用於編譯器已宣告變數的初始化表示式,或使用lambda表示式引數來推導。除非確實需要使用轉換,否則都需要用auto。它擁有可靠性 效能 不進行任何轉換 可用性 拼寫錯誤 效率 量 需要注意的是auto只代表型別或類,無法代表指標 引用等...

auto關鍵字 decltype關鍵字

自動型別推斷 1 使用auto關鍵字的變數必須有初始值。在定義的時候進行初始化 2 函式引數和模板引數不能被宣告為auto。3 使用auto關鍵字進行型別推導時,如果初始化表示式是引用型別,編譯器會去除引用,除非顯示宣告 4 使用auto使用auto關鍵字進行型別推導時,編譯器會自動忽略頂層cons...