分享
三行代码  ›  专栏  ›  技术社区  ›  OMG

默认情况下应调用Move构造函数

  •  1
  • OMG  · 技术社区  · 1 周前

    ubuntu18上的Gcc-7.5.0

    #include<iostream>
    using namespace std;
    
    class Integer 
    {
        int *dInt = nullptr;
    public: 
        Integer(int xInt)  {
            dInt = new int(xInt);
            cout<<"Integer Created"<<endl;
        } 
        Integer(const Integer &xObj)
        {
            cout<<"Copy called"<<endl;
            dInt = new int(xObj.mGetInt());
        }
    
        Integer(Integer &&xObj)
        {
            cout<<"Move called"<<endl;
            dInt = xObj.dInt;
            xObj.dInt = nullptr;
        }
    
        Integer& operator=(const Integer &xObj)
        {
            cout<<"Assignment operator called"<<endl;
            *dInt = xObj.mGetInt();
            return *this;
        }
    
        Integer& operator=(Integer &&xObj)
        {
            cout<<"Move Assignment operator called"<<endl;
            delete dInt;
            dInt = xObj.dInt;
            xObj.dInt = nullptr;
            return *this;   
        }
        ~Integer() 
        {
            cout<<"Integer destroyed"<<endl;
            delete dInt;
        }
    
        int mGetInt() const {return *dInt;}
    };
    
    class Product 
    {
        Integer dId;
    public: 
        Product(Integer &&xId)
        :dId(xId)
        {
    
        }
    };
    int main () 
    {
        Product P(10); // Notice implicit conversion of 10 to Integer obj.
    }
    

    在下面的例子中,我无法避免创建Integer类的临时对象,有没有什么好方法可以避免创建临时对象呢。

        Product(const Integer &xId)
        :dId(xId)
        {
    
        }
        
        Product(10); // inside main
    

    1 回复  |  直到 1 周前
        1
  •  3
  •   Asteroids With Wings    1 周前

    std::move

    在以下函数体内部:

    void foo(int&& x);
    

    表达 x 是左值 int . int&& .

    参考并不真的“存在” 里面 foo 就像使用原版一样 内景 里面 这样做会 创建一个副本,如你所知。


    这将完成以下工作:

    Product(Integer&& xId)
        : dId(std::move(xId))
    {}
    

    不过,我鼓励你 Integer

    Product(Integer xId)
        : dId(std::move(xId))
    {}
    

    这样,就可以使用相同的构造函数来传递左值 同样,我们会制作一份副本 ,而如果没有,则移动将自动发生(例如,通过传入文本,这将自动触发对 整数 的移动构造函数)。