鍍金池/ 問(wèn)答/Java  C  C++  Linux/ C++ 的thread不能改變引用參數(shù)的值嗎

C++ 的thread不能改變引用參數(shù)的值嗎

下面的程序輸出結(jié)果為0,不理解為什么會(huì)這樣,不應(yīng)該是1嗎?

void fun(int &a)
{
    a =1 ;
}
int main()
{
    int a =0 ;
    std::thread t(fun,a) ;
    t.join () ;
    cout<<a<<endl ;
    return 0 ;
}
回答
編輯回答
維他命

標(biāo)準(zhǔn)約定std::thread構(gòu)造時(shí)向函數(shù)對(duì)象傳遞實(shí)際參數(shù)的拷貝(支持移動(dòng)語(yǔ)義),而不是轉(zhuǎn)發(fā)實(shí)際參數(shù)(你可以通過(guò)打印實(shí)際參數(shù)和形式參數(shù)的地址來(lái)檢測(cè)這一行為)。即fun的形式參數(shù)是被a的拷貝初始化的,所以形式參數(shù)a并不是main函數(shù)內(nèi)a的引用,在fun內(nèi)賦值自然不會(huì)改變main函數(shù)內(nèi)a的值。

如果你希望“以引用的方式傳參”,常用解決方案之一是使用std::ref,即std::thread(fun, std::ref(a));。

2018年8月15日 17:05
編輯回答
拮據(jù)
int main()
{
    int a = 0;
    thread t([&]() {
        a = 1;
    });
    t.join();
    cout << a << endl;
    return 0;
}
2017年4月17日 23:44