2015-09-25 62 views
6

考慮下面的代碼:爲什麼在跟蹤返回類型中使用了decltype?

template< class T1 , class T2> 
auto calc(T1 a , T2 b) 
{ 
    return a + b ; 
} 


template< class T1 , class T2> 
auto calc(T1 a , T2 b) -> decltype(a + b) 
{ 
    return a + b ; 
} 

什麼在第二個代碼的區別? 你可以舉一些例子,這有什麼不同或者它在這裏有所作爲?

回答

6

請注意,純粹的auto返回類型是僅用於C++ 14的,而跟蹤返回類型decltype用於C++ 11。參考輸入圖片時出現差異,例如在這樣的代碼:

#include <type_traits> 

struct Test 
{ 
    int& data; 

    auto calc1() 
    { 
     return data; 
    } 

    auto calc2() -> decltype(data) 
    { 
     return data; 
    } 
}; 

int main() 
{ 
    int x; 
    Test t{x}; 
    static_assert(std::is_same<int, decltype(t.calc1())>::value, ""); 
    static_assert(std::is_same<int&, decltype(t.calc2())>::value, ""); 
} 

如果你想刪除->decltype(),並保持你的代碼行爲一樣,你可以使用C++ 14的構建decltype(auto)

decltype(auto) calc3() // same as calc2() above 
{ 
    return data; 
} 

它保留了回報referenceness類型也是如此。

如果你已經知道你的返回類型是一個參考,只是使它明確

auto& calc4() // same as calc2() above 
{ 
    return data; 
} 
+0

感謝您從參考維護都是相同的回答雷克斯:) 好了,所以分開。那麼應該使用哪一個或哪一個更安全? –

+0

這取決於你想要什麼。我將使用'auto'和'auto&'來明確返回類型的參考性。有時'decltype'可以有其優點,例如在SFINAE上下文中,你想延遲實例化等[但是這是先進的東西](http://stackoverflow.com/a/24109800/819272)。 – TemplateRex

+0

decltype(auto)有時可能是危險的。例如: decltype(auto)foo(){auto x = 5; return(x); }因爲(x)是一個表達式,所以type是int&(許多人圍繞返回這個圓括號)。所以這個函數返回一個本地引用,這是一個bug! –

相關問題