簡體   English   中英

std :: thread參數(值與const)

[英]std::thread arguments (value vs. const)

當我使用函數生成新線程( std::thread )時,該函數的參數是按值而不是按引用的。

因此,如果我使用參考參數( int& nArg )定義該函數,則我的編譯器(mingw 4.9.2)將輸出錯誤(在compilian-suaeli中,類似“缺少復制構造函數”之類的;-)

但是,如果我將該引用參數const int& nArg const( const int& nArg ),則不會抱怨。

有人可以解釋一下嗎?

如果要傳遞引用,則必須std::reference_wrapper std::ref將其包裝到std::reference_wrapper 喜歡:

#include <functional>
#include <thread>

void my_function(int&);

int main()
{
    int my_var = 0;
    std::thread t(&my_function, std::ref(my_var));

    // ...
    t.join();
}

std::thread的參數僅使用一次。

實際上,它將它們存儲在std::tuple<Ts...> tup 然后執行f( std::get<Is>(std::move(tup))...)

傳遞std::get右值tuple意味着可以從元組中的值或右值引用字段中獲取狀態。 如果沒有元組是右值,它會給它一個引用。

除非您使用reference_wrapper (即std::ref / std::cref ),否則您傳遞給std::thread作為值存儲在std::tuple 這意味着您調用的函數被傳遞一個rvalue到std::tuple的值。

右值可以綁定到const&而不能綁定到&

現在,上面的std::tuple是一個實現細節,是std::thread一個設想實現。 標准中的措詞較為晦澀。


為什么標准說發生這種情況? 通常,不應將&參數綁定到將立即丟棄的值。 該函數認為它正在修改調用者可以看到的內容。 如果該值將被立即丟棄,則通常是調用者出錯。

另一方面, const&參數會綁定到將立即丟棄的值,因為我們將它們用於效率目的而不僅僅是參考目的。

或者,大概是因為

const int& x = 7;

是合法的

int& x = 7;

不是。 第一個是對邏輯上被丟棄的對象的const& (不是由於引用生存期的延長,而是邏輯上是臨時的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM