如何正确绑定rvalues到构造函数?

时间:2015-06-26 04:53:02

标签: c++ most-vexing-parse

这是我的代码:

#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?我在某种程度上混淆了将rvalues绑定到rvalue引用,我想要一些澄清。

1 个答案:

答案 0 :(得分:3)

test m(dummy());声明一个名为m的函数。你可能意味着:

test m{ dummy{} };

声明变量m传递临时dummy