2013-11-03 67 views
1
#include<iostream> 
#include<vector> 

struct Empty {}; 

template <typename V> 
void add(V&& element) 
{ 
    static_assert(std::is_rvalue_reference<V>::value, "V is not a rvalue reference"); 
} 

int main(int argc, char *argv[]) 
{ 
    add(Empty()); 

    std::cin.ignore(); 
    return 0; 
} 

我不明白爲什麼在這裏失效static_assert,V不等於V&&這裏?的std ::與右值引用參數模板函數內部is_rvalue_reference

+1

V只是V這裏...... – kennytm

+2

'V'被推斷爲'Empty',所以'V'不是右值參考類型; 'V &&'是。 –

+0

但是如果我轉發它,它會被推斷爲V &&,我有這種感覺我錯過了這裏的東西 – Guillaume07

回答

2

V不是右值參考 - decltype(element)是(如果element是右值)。 V只是element的一般類型。特別是:

typename std::remove_reference<decltype(element)>::type; // V 
+1

不完全是,如果'element'被推導爲一個左值參考,那麼V將會是'T&'。 – kennytm