2012-04-18 66 views
2

如何在C++11中實現auto?我試過以下,它工作在C++11C++中如何自動實現11

auto a = 1; 
// auto = double 
auto b = 3.14159; 
// auto = vector<wstring>::iterator 
vector<wstring> myStrings; 
auto c = myStrings.begin(); 
// auto = vector<vector<char> >::iterator 
vector<vector<char> > myCharacterGrid; 
auto d = myCharacterGrid.begin(); 
// auto = (int *) 
auto e = new int[5]; 
// auto = double 
auto f = floor(b); 

我想看看如何可以使用普通C++

+7

它採取右側的東西的類型,並把它放在左邊。 – GManNickG 2012-04-18 07:53:01

+1

它採用與decltype()相同的方式並使用它來代替自動 – Geoffroy 2012-04-18 07:53:34

+0

您是否真的想知道它是如何實現的?我很確定這取決於編譯器。 – juanchopanza 2012-04-18 07:55:55

回答

10

它大致相同的事情,因爲它會在一個函數模板使用類型推演,所以例如:

auto x = 1; 

確實有同樣的東西:

template <class T> 
T function(T x) { return input; } 

function(1); 

編譯器必須找出作爲參數傳遞的表達式的類型,並從中實例化具有適當類型的函數模板。如果我們從這開始,那麼decltype基本上給了我們這個模板中的T,並且auto給了我們這個模板中的x

我懷疑相似的模板類型推演使得它更容易爲委員會接受autodecltype到語言 - 他們基本上只是增加訪問一個已經需要的功能模板類型推演的新途徑。

+2

不完全。 ''decltype(function_that_returns_reference())''是一些'U',但'function(function_that_returns_reference())'會推斷'U',就像'auto x = function_that_returns_reference()'一樣。這是'auto',它給了我們模板中的'T'。 – 2012-04-18 09:43:24

+0

@ R.MartinhoFernandes:是的,有一些細微的差異 - 這就是爲什麼我說「...... **粗略**同樣的事情......」和「...... **有同樣的東西」 ...「。模板在'auto'前幾年... – 2012-04-18 14:04:08

7

在C++中,每一個表情都有價值來實現。例如,(4+5*2)是一個表達式,其值等於14,類型爲int。所以,當你寫:

auto v = (4+5*2); 

編譯器檢測右側表達的類型,並與檢測型(有一些例外,閱讀評論)取代auto,它變成:

int v = (4+5*2); //or simply : int v = 14; 

同樣,

auto b = 3.14159; //becomes double b = 3.14159; 

auto e = new int[5]; //becomes int* e = new int[5]; 

+0

那麼v [i]的類型是什麼,其中v是標準庫容器?我的理解是,它是一個左值,因爲它通過引用返回。但是表達式的*類型是引用,還是刪除了引用?這對auto的行爲有影響,因爲auto x = v [1]取值。 – juanchopanza 2012-04-18 09:15:33

+2

@juanchopanza在這種情況下'v [i]'的類型是一些'T&'(或'T const&')。 'auto x = v [i]'然而會推導出'T',而不是'T'。看到這裏:http://stackoverflow.com/a/8797915/46642 – 2012-04-18 09:48:58

+0

@ R.MartinhoFernandes權利,那麼'汽車'做一些比檢測表達式的類型更復雜。 – juanchopanza 2012-04-18 09:52:43

1

它的工作原理像以前一樣:)

你從來沒有打一個編譯器錯誤,告訴你:

error: invalid conversion from const char* to int

這樣的代碼片斷:int i = "4";

好,auto簡單地利用了這一事實編譯器知道=符號右側的表達式類型,並重新使用它來鍵入您聲明的變量。

+0

+1。以不同的角度來看待汽車。 – Nawaz 2012-04-18 09:35:51