2016-05-15 63 views
2

顯然,可以將右值引用傳遞給std::thread構造函數。我的問題是在cppreference中定義這個構造函數。它說,這種構造:std :: thread構造函數如何檢測右值引用?

template< class Function, class... Args > 
explicit thread(Function&& f, Args&&... args); 

創建新的std :: thread對象,並將其與 執行線程關聯。首先,構造拷貝/移動所有參數(這兩個 函數對象f和所有ARGS ...),以線程訪問的存儲彷彿 由函數:

template <class T> 
typename decay<T>::type decay_copy(T&& v) { 
    return std::forward<T>(v); 
} 

至於我可以檢查:

std::is_same<int, std::decay<int&&>::type>::value 

返回true。這意味着std::decay<T>::type會刪除參數的右參考部分。那麼std::thread構造函數如何知道哪個參數是由左值或右值引用傳遞的?因爲所有T&T&&std::decay<T>::type轉換爲T

+0

」將值左值,數組指向和函數指針隱式轉換應用於類型T,刪除cv限定符,並將結果類型定義爲成員typedef類型「http:// en.cppreference.com/w/cpp/types/decay - 你在哪裏看到它會刪除引用? – xaxxon

+0

@xaxxon你缺少':: type'。 –

+0

@ T.C。刪除 - 但爲什麼他們是一樣的? – xaxxon

回答

2
auto s = std::decay_copy(std::string("hello")); 

等同於:

template<> 
std::string std::decay_copy<std::string>(std::string&& src) { 
    return std::string(std::move(src)); 
} 

std::string s = decay_copy<std::string>(std::string("hello")); 
+0

就是那個C++?....我從來沒有見過函數名在< – xaxxon

+0

@xaxxon中或多或少地聲明。它試圖展示模板擴展的結果。 –

1

這是一個完美的轉發通病。如果你想恢復函數中有關右值的信息,你必須使用std :: forward std::forward。如果你對值類型檢測感興趣,你可以閱讀這個value_category。從描述中你可以找到編譯器在編譯時如何識別右值,左值,右值,左值和右值的信息。

3

std::thread構造函數知道它的參數的值類,因爲它知道什麼FunctionArgs...是,它使用完美向前它的參數decay_copy(或同等學歷)。

實際的線程函數不知道值類別。它總是作爲右值與所有右值參數一起調用 - 這是有道理的:fargs...的副本對於線程是本地的,並且不會在其他任何地方使用。 「

相關問題