跳至內容

Auto(C++)

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

auto是 C + + 程式設計語言的關鍵字。自 C + + 十一以來,auto 關鍵字用佇兩種情形:聲明變數的時陣根據初始化表達式的自動推斷該變數的類型、聲明函式時函式倒轉值的預留位置。C + + 九十八標準中 auto 關鍵字用佇自動變數的聲明,毋過因為使用足濟閣加額,佇咧 C + + 十一中已經刪除這一用法。

簡單理解講

auto 會當佇聲明變數的時陣根據變數初始值的類型自動為此變數選擇匹配的類型。C + + 語言類似的關鍵字閣有 decltype。

舉例:對值 x=一;即可以聲明:int x=一抑是 long x=一,嘛會當直接聲明 auto x=一。

其他的語言的類似功能包括 C # 的 var 關鍵字。

用法

根據初始化表達式自動推斷被聲明的變數的類型,如:

` ` ` auto f=三孵一四 ; / / double auto s ( " hello " ) ; / / const char * auto z=new auto ( 九 ) ; / / int * auto x 一=五 , x 二=五曉空 , x 三='r'; / / 鋪排,必須是初初化學習一人知 ` ` `

猶毋過,遮爾簡單的變數聲明類型,無建議用 auto 關鍵字,是愛閣較清楚的直接寫出其類型。

auto 關鍵字閣較適用類型傷長複雜、變數使用範圍專一時,使程式閣較清楚讀:

` ` ` std : : vector < int > vect ; for ( auto it=vect . begin ( ) ; it  !=vect . end ( ) ; + + it ) { / / it 的被型是 std : : vector < int > : : iterator std : : cin > > * it ; } ` ` `

或者是儲存 lambda 表達式類型的變數聲明:

` ` ` auto ptr=[ ] ( double x ) { return x * x ; } ; / / 鋪排 std : : function < double ( double ) > 函縛象 ` ` `

咧模板函式定義的時,若準變數的類型依賴佇模板參數,使用 auto 關鍵字予得咧編譯期確定遮的類型,如:

` ` ` template < class T , class U > void Multiply ( T t , U u ) { auto v=t * u ; std : : cout < < v ; } ` ` `

模板函式的返回類型若準嘛是依賴佇咧對模板參數推導,

` ` ` template < typename _ Tx , typename _ Ty > auto multiply ( _ Tx v 一 , _ Ty v 二 )-> decltype ( _ Tx * _ Ty ) { return v 一 * v 二 ; } auto result=multiply ( 一百空一 , 一孵四一四 ) ; / / 鋪排的是 double ` ` `

語意

使用 auto 關鍵字做類型自動推導的時陣,依照照規則來施加以下的規則:

  • 首先,若是初始化表達是參照,代先去參照;
  • 最一步了,若賰的初初化表達式有頂層的 const 而且 / 抑是 volatile 限定符,共除掉。

這一組規則若模板函式的模板參數推導(template argument deduction)時的規則。猶毋過 auto 關鍵字會使對 C + + 十一風格的花括號 { 佮 } 包圍的值列表推導出 std : : initializer \ _ list;若模板函式這个形參推導的時陣無認為這種值列表是一个類型,因此袂當由值列表來推導出 std : : initializer \ _ list 類型。

因而,使用 auto 關鍵字聲明變數的類型,袂當自動推導出頂層的 CV-qualifiers,嘛袂當自動推導出參照類型,需要顯式指定。比如講:

` ` ` const int v 一=一百空一 ; auto v 二=v 一 ; / / v 二嬸仔是 int,曲去初始化表現出面的枋枋 const v 二=一百空二;/ / 會使鋪值 auto al={ 十 , 十一 , 十二 } ; / / ma型是 std : : initializer _ list < int > template < class T > void foo ( T arg ) ; / / 函模板含明 foo ( v 二 ) ; / / 函模板板影響響 void foo < int > ( int ) ` ` `

若需要有頂層的 CV-qualifiers,或者是參照的類型,解決辦法是顯式指明:

` ` ` const auto & v 三=v 一 ; foo < const int & > ( v 一 ) ; / / 直接指明模li̋n-jín抹粉形 template < class T > void foo ( const T & arg ) ; / / 抑是偏特化模板函函 ` ` `

若是 auto 關鍵字閣共𤆬起去 & 號,聲明參照類型,是無執行 const 剝掉(const-stripping), 比如講:

` ` ` const int c=零 ; auto & rc=c ; rc=四十四 ; / / 鋪排。,const int ma型 ` ` `

這是因為如果不或制 const 剝掉,得著一个非常數參照型變數,指向矣 const 變數,這顯然是袂當接受的。模板參數推導嘛遵照這規則。

初初化表達式為陣列,auto 關鍵字推導的類型為指標。這是因為陣列名佇初始化表達式中自動隱式轉換做首元素位址的正值。比如講:

` ` ` int a [九] ; auto j=a ; std : : cout < < typeid ( j ) . name ( ) < < " " < < sizeof ( j ) < < " " < < sizeof ( a ) < < std : : endl ; ` ` `

因為 C + + 規定字串字面量是左值,所以會當通過 & 運算子直接提位址:

` ` ` auto al=& " hello " ; / / a 一的被型是 const char ( * ) [六] ` ` `

auto 關鍵字的類型完美轉發

C + + 十一使用 auto 聲明變數的時陣,如:` auto & & var=initValue ; `「auto & &」並無意味著這一定是正港參照類型的變數,是類似模板函式參數的類型推捒,既然是左值參照,嘛是可能是正港參照。其目的是共初初化表達式的值分類情形,完美轉發予由 auto 聲明的變數。嘛即:

  • 若初初化值(initializer)是類型 A 的左值,則聲明的變數類型為倒值參照 A &;
  • 若初初化值是類型 A 的正值,則聲明的變數類型為正楷參照 A & &。

參考文獻