2012-07-12 65 views
0

由於auto和decltype都用於推斷類型。我以爲 他們會一樣。decltype和auto之間的等價

但是,this問題的答案是否定的。

我仍然認爲它們不能完全不同。 我能想到一個簡單的例子,其中i的類型在以下兩種情況下都是相同的。

auto i = 10; and decltype(10) i = 10; 

那麼auto和decltype行爲等價的可能情況是什麼?

+4

你在第二定義重複10。這不足以區別嗎?這是給我的。 'auto'在日常生活中比'decltype'更有用,它主要用作元編程工具。 – 2012-07-12 20:18:57

+1

現在,我只關心推斷的類型。 – 2012-07-12 20:21:11

+1

它們並不完全不同。你現在喜歡的其他答案呢? – 2012-07-12 20:21:28

回答

7

auto行爲完全相同一樣的模板參數推導,這意味着如果不指定對它的引用,你沒有得到一個。 decltype是表達的只是類型,因此需要引用到:

#include <type_traits> 

int& get_i(){ static int i = 5; return i; } 

int main(){ 
    auto i1 = get_i(); // copy 
    decltype(get_i()) i2 = get_i(); // reference 
    static_assert(std::is_same<decltype(i1), int>::value, "wut"); 
    static_assert(std::is_same<decltype(i2), int&>::value, "huh"); 
} 

Live example on Ideone.

+1

auto也可以與decltype一起使用。 http://msdn.microsoft.com/en-us/library/dd537655.aspx – 2012-07-12 20:22:31

+1

@ 0A0D:這只是後期指定的返回類型。 – Xeo 2012-07-12 20:24:04

+7

更具體地說,'decltype'將其表達式的值類別轉換爲引用限定:左值被限定爲左值引用,而xvalue被限定爲右值引用。 get_i()的類型不是「int&',」它是「int類型的左值。表達式從來沒有引用類型。 – 2012-07-12 20:24:43

相關問題