2015-06-26 85 views
1

這裏是我的代碼:使用test m(dummy());如何正確地將rvalues綁定到構造函數?

輸出

#include <iostream> 


class dummy{ 
    public: 
    //constructor + destructor 
    dummy(){ 
    std::cout<<"dummy constructed"<<std::endl; 
    } 


    //copy 
    dummy(const dummy& o){ 
    std::cout<<"dummy copy init"<<std::endl; 
    } 


    void operator=(const&dummy){ 
    std::cout<<"dummy copy operator"<<std::endl; 
    } 

    //moves 
    dummy(dummy&& other){ 
    std::cout<<"dummy move init"<<std::endl;   
    } 

    void operator=(dummy&&){ 
    std::cout<<"dummy move copy"<<std::endl; 
    } 

}; 



class test{ 
    public: 
    dummy d; 

    test(dummy&& d):d(std::move(d)){ 
    std::cout<<"test"<<std::endl; 
    } 
}; 




int main(int argc, char** argv) { 

    test m(dummy());  //prints NOTHING. 
    test t(std::move(dummy())); 

    return 0; 
} 

沒有

使用test t(std::move(dummy()));

輸出:

dummy constructed 
dummy move init 
test 

這是預期的事情。

所以我的問題是,

是否必須使用std::move如果該參數爲type&&? 而不是dummy()視爲右值,爲什麼我需要使用std::move?我有點混淆關於右值引用rvalues,我想需要一些澄清。

+1

https://en.wikipedia.org/wiki/Most_vexing_parse – Mat

回答

3

test m(dummy());聲明稱爲m的函數。你大概的意思是:

test m{ dummy{} }; 

其聲明一個變量m傳遞臨時dummy

+0

呃奇怪,爲什麼括號?它們不是用於'初始化列表'嗎? –

+0

@CarloBrew這個'('不清楚它是一個函數參數列表還是一個參數列表,但是'{'只能是一個參數列表,大括號可以用於爲對象提供初始化程序的任何情況。 –

相關問題