常量左值參考我最近一直在尋找到轉發引用C++和下面是我目前的概念的理解一個簡單的總結。轉發參考VS模板代碼
比方說,我有一個模板功能foo
採取的轉發參考T
類型的一個參數。
template<typename T>
void foo(T&& arg);
如果我把這種功能與左值然後T
將推導出T&
使arg
參數是T&
類型的由於參考塌陷規則T& && -> T&
。
如果該函數獲得與無名暫時的,稱爲諸如函數調用的結果,然後T
將推導出T
使arg
參數是T&&
類型。
Inside foo
然而,arg
是一個命名參數,因此如果我想將參數傳遞給其他函數並仍然保持其值類別,則需要使用std::forward
。
template<typename T>
void foo(T&& arg)
{
bar(std::forward<T>(arg));
}
據我瞭解,cv-qualifiers不受此轉發影響。這意味着,如果我調用foo與命名常量變量然後T
將推導出const T&
以及因此arg
類型也將是const T&
由於參考塌陷規則。爲常量右值T
將推導出const T
因此arg
將const T&&
類型。
這也意味着如果我在foo
中修改arg
的值,如果我確實通過一個const變量傳遞給它,那麼我將得到一個編譯時錯誤。
現在到我的問題。 假設我正在編寫一個容器類,並且想要提供一個將對象插入到我的容器中的方法。
template<typename T>
class Container
{
public:
void insert(T&& obj) { storage[size++] = std::forward<T>(obj); }
private:
T *storage;
std::size_t size;
/* ... */
};
通過使insert
成員函數採取的轉發參考obj
我可以使用std::forward
如果insert
是INFACT傳遞一個臨時對象取所存儲的類型T
的移動賦值操作的優點。
以前,當我不知道任何關於轉發引用時,我會寫這個成員函數採用一個常量左值引用: void insert(const T& obj)
。
這樣做的缺點是,如果insert
傳遞臨時對象,則此代碼不利用(假設更有效)移動賦值運算符。
假設我沒有錯過任何東西。
是否有任何理由,提供兩個重載插入功能?一個採取常數左值參考,另一個參考轉發參考。
void insert(const T& obj);
void insert(T&& obj);
我問的原因是the reference documentation for std::vector
指出push_back
方法有兩種重載。
void push_back (const value_type& val);
void push_back (value_type&& val);
爲什麼第一個版本(採取const value_type&
)需要的?
'insert(T && obj)'不是轉發引用。它由班級固定。 – Jarod42