1

ここに私のコードがあります:

#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 m(dummy());

出力:なし

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

出力:

dummy constructed
dummy move init
test

これは期待されるものです。

私の質問は、

std::moveパラメータが の場合、使用は必須type&&ですか? 右辺値と見なされないdummy()のに、なぜ使用する必要があるのstd::moveですか? 右辺値を右辺値参照にバインドすることについてどういうわけか混乱しており、明確化が必要です。

4

1 に答える 1

3

test m(dummy());という関数を宣言しますm。あなたはおそらく次のことを意味していました:

test m{ dummy{} };

m一時的な を渡す変数を宣言しますdummy

于 2015-06-26T05:00:36.943 に答える