C 11 型別推導auto

2021-09-07 09:41:09 字數 2746 閱讀 2812

在c++11之前,auto關鍵字用來指定儲存期。在新標準中,它的功能變為型別推斷。auto現在成了乙個型別的佔位符,通知編譯器去根據初始化**推斷所宣告變數的真實型別。

使用auto會拖慢c++效率嗎?完全不會,因為在編譯階段編譯器已經幫程式設計師推導好了變數的型別。

使用auto會拖累c++編譯效率嗎?完全不會,因為在auto出現之前c++需要先推導等號右側表示式的型別,然後檢查它與變數的型別是否可以轉換(相容轉換、向下型別轉換和自定義型別轉換)。auto出現之後,c++在推導出等號右側表示式的型別之後,直接指定給變數。

auto並非一種型別宣告,而是型別宣告時的佔位符,編譯器在編譯時期會將auto替代為變數的實際型別。因此不能和typeid,sizeof一起使用。

1.使用auto通常意味著更短的**(除非你所用型別是int,它會比auto少乙個字母)

試想一下當你遍歷stl容器時需要宣告的那些迭代器(iterator),現在不需要去宣告那些typedef就可以得到簡潔的**了。

std::mapstring, std::vector>map;

for(auto it = begin(map); it != end(map); ++it) {}

2.返回值佔位符

auto不能用來宣告函式的返回值,但如果函式有乙個尾隨的返回型別時,auto是可以出現在函式宣告中返回值位置。這種情況下,auto並不是告訴編譯器去推斷返回型別,而是指引編譯器去函式的末端尋找返回值型別。在下面這個例子中,函式的返回值型別就是operator+操作符作用在t1、t2型別變數上的返回值型別。

template auto compose(t1 t1, t2 t2) -> decltype(t1 +t2)

auto v = compose(2, 3.14); //

v's type is double

3.auto宣告的變數必須初始化

int

main()

; auto z = new auto(10

);

auto a;

//錯誤,

未初始化

auto int b = 1; //錯誤,

auto不能和其它型別一起使用(c++98和c中可以)

auto c = new auto(); //

錯誤,沒有初始化

auto d = 1, e = 2.01; //

錯誤,定義在乙個auto序列的變數必須始終推導成同一型別

return0;

}

4.c++標準中規定auto可以與cv(const & volatile qualifiers)限制符一起使用,不過宣告為auto的變數不能從其初始化表示式中帶走cv限制符

從const變數推導或用auto接收從函式返回的const變數,會丟失const屬性,除非顯示宣告為引用型別。

從引用變數推導或用auto接收從函式返回的引用變數,會丟失引用特性,除非顯示宣告為引用型別。

#include #include 

#include

using

namespace

std;

struct

student

student(

const student&rhs)

};student& backref(student&s)

intmain()

; auto stu2 =stu1;

auto stu3 = backref(stu1); //

函式返回引用型別,但實際會呼叫拷貝建構函式

stu3.age = 12

; auto& stu4 = backref(stu1); //

顯示新增引用後,還是stu1

stu4.age = 18

; std::cout

<< stu1.age <<:endl>

std::cout

<< stu2.age <<:endl>

std::cout

<< stu3.age <<:endl>

std::cout

<< stu4.age <<:endl>

return0;

}

view code

auto也不是萬能的,受制於語法的二義性,或者是實現的困難性,auto往往也有使用上的限制。

#include #include 

#include

using

namespace

std;

struct

str;

void fun(auto x) //

2.auto函式引數,無法通過編譯

intmain()

;

return0;

}

分析一下上述4中不能推導的情況:

1.對於函式fun來說,auto不能是其形參型別。由於其有預設引數,所以應該推導fun形參x的型別為int型。但事實無法符合大家的想象,如果程式設計師需要泛型的引數,還是求助與模版。

2.對於結構體或類來說,非靜態成員變數的型別不能為auto。編譯器阻止auto對結構體中的非靜態成員進行推導,即使成員擁有初始值。

3.宣告auto陣列。x是乙個陣列,y型別是可以推導的,而宣告auto z[3]這樣的數字同樣會被編譯器禁止。

4.在例項化模版的時候使用auto作為模版引數,雖然讀者認為這裡一眼而知是int型別,但編譯器卻阻止了編譯。

C 11 型別推導auto關鍵字

在c 11中,auto關鍵字被作為型別自動型別推導關鍵字 1 基本用法 c 98 型別 變數名 初值 int i 10 c 11 auto 變數名 初值 auto i 3.14 借助於auto關鍵字,可對變數進行隱式的型別定義,即由編譯器在編譯期間根據變數的初始化語句,自動推斷出該變數的型別.aut...

c 11 型別推導

auto與decltype都是在編譯時期進行自動型別的推導 auto name value 1.int x 0 2.auto p1 x p1 為 int auto 推導為 int 3.auto p2 x p2 為 int auto 推導為 int 4.auto r1 x r1 為 int auto ...

C 11語法auto推導返回

c 不允許直接推導auto返回型別,如果要用auto返回型別,需要用decltype 宣告尾返回型別 如下面 template auto add a x,b y decltype x y 呼叫方式還是和普通的模板元函式一樣 std cout add 5,8 std endl std cout add...