2011-08-21 42 views
59

請看看下面的簡單代碼:C++ 11 auto:如果它獲得一個常量引用呢?

class Foo 
{ 
public: 
    Foo(){} 
    ~Foo(){} 

    Foo(const Foo&){} 
    Foo& operator=(const Foo&) { return *this; } 
}; 

static Foo g_temp; 
const Foo& GetFoo() { return g_temp; } 

我試圖用auto這樣的:

auto my_foo = GetFoo(); 

我預計my_foo將是一個常數參考Foo,這是回報函數的類型。但是,auto的類型是Foo,而不是參考。此外,my_foo通過複製g_temp來創建。這種行爲對我來說並不明顯。

爲了獲得參考Foo,我需要這樣寫:

const auto& my_foo2 = GetFoo(); 
     auto& my_foo3 = GetFoo(); 

問題:爲什麼auto推斷的GetFoo的返回類型爲對象,而不是一個參考?

+0

你使用什麼編譯器? –

+0

VC++ 2010和Intel C++編譯器 – minjang

回答

49

閱讀這篇文章:Appearing and Disappearing consts in C++


在C++ 0x中的自動變量類型推演基本相同 模板參數。 (據我所知,兩者之間唯一的差別是 是自動變量的類型可以從 初始值設定項列表中推導出來,而模板參數的類型可能不會) 因此,以下每個聲明都聲明變量類型 INT(從未const int的):

auto a1 = i; 
auto a2 = ci; 
auto a3 = *pci; 
auto a4 = pcs->i; 

在扣除型模板參數和自動變量,只有 頂級consts被刪除。給定一個函數模板採取 指針或引用參數,無論是指出 或引用的常量性,以保留:

template<typename T> 
void f(T& p); 

int i; 
const int ci = 0; 
const int *pci = &i; 

f(i);    // as before, calls f<int>, i.e., T is int 
f(ci);    // now calls f<const int>, i.e., T is const int 
f(*pci);   // also calls f<const int>, i.e., T is const int 

此行爲是舊聞,將因爲它於C + +98和 C++ 03。用於自動變量對應的行爲是,當然,新 到的C++ 0x:

auto& a1 = i;  // a1 is of type int& 
auto& a2 = ci;  // a2 is of type const int& 
auto& a3 = *pci; // a3 is also of type const int& 
auto& a4 = pcs->i; // a4 is of type const int&, too 

既然可以保留CV-限定符如果類型是引用或指針,就可以這樣做:

auto& my_foo2 = GetFoo(); 

而不必將其指定爲const(同樣適用於volatile)的。

編輯:至於爲什麼auto演繹的GetFoo()返回類型的值,而不是引用(這是你的主要問題,對不起),想想看:

const Foo my_foo = GetFoo(); 

以上將創建一個複製,因爲my_foo是一個值。如果auto要返回一個左值引用,則上述操作將不可能。

+5

你沒有解釋爲什麼ref-qualifier也被刪除了。 –

+3

@Tomalak Geret'kal:你的意思是他們爲什麼決定這麼做?這很有道理,不是嗎?考慮這個:'Foo my_foo = GetFoo();'而且'GetFoo()'沒有返回一個const類型。它將與以下內容相同:'auto my_foo = GetFoo();'。如果汽車也包含了這個參考,那麼你將無法做到上述。 – someguy

+5

不要告訴我;把它放在你的答案中。 –

相關問題