2017-01-13 62 views
2

以下代碼結果0100(符合CLang,GNU ++ 14)。我希望0001,因爲需要FUNC右值向量作爲參數,然後向前(C)[0]是爲int const引用,所以鍵入decltype(自動)的扣應導致到const int的&。請幫我理解結果。謝謝!爲什麼從rvalue的int元素類型中扣除decltype(auto)是int&?

template <typename T> 
decltype(auto) func(T&& c) 
{ 
    return forward<T>(c)[0]; 
} 

int main(int argc, const char * argv[]) 
{ 
    cout 
    << is_same< int, decltype(func(vector<int>{3}))>::value 
    << is_same< int&, decltype(func(vector<int>{3}))>::value 
    << is_same< const int, decltype(func(vector<int>{3}))>::value 
    << is_same< const int&, decltype(func(vector<int>{3}))>::value 
    << endl; 
    return 0; 
} 

輸出:

0100 

回答

4

c是一個rvalue參考。

[]有一個const和非const過載。當通過vector<T,A>&&類型的矢量時,選擇的過載是非const之一。

[]可以被改變(使&&重載返回一個值或右值),但它可以破壞現有的代碼。因此,至少在std2之前,這可能不會發生,這允許在不破壞現有代碼的情況下破壞std中的修訂版。

+0

'std2'?從來沒有聽說過。你有沒有參考指出?謝謝。另外,我想這個問題是關於'decltype(auto)'你得到實際類型的事實,即'U'代表'operator []'而不是'U'。 – skypjack

+0

@skypjack編譯器實際返回'int&',OP期望'const int&'。 –

+0

@ A.S.H哦,我明白了。錯過了問題中的評論。抱歉。 – skypjack

相關問題