如何让move构造函数故意调用

How to get the move constructor calling deliberately

本文关键字:故意 调用 构造函数 move      更新时间:2023-10-16

考虑以下代码:

class Base {
public:
    int bi;
    Base() : bi(100)    {std::cout << "nBase default constructor ...";}
    Base(int i) : bi(i) {std::cout << "nBase int constructor: "<< bi;}
    Base(const Base& b) {std::cout << "nBase copy constructor";}
    Base(Base&& b)      {std::cout << "nBase move constructor";}
};
Base getBase() {
    cout << "nIn getBase()";
    return Base();  
}
int main() {
    Base b2(getBase());  
    Base b3 = Base(2);   
    Base b4 = getBase(); 
}

尽管给出了右值,main中的上述构造函数都没有调用move构造函数。是否有一种方法来确保用户定义的移动构造函数被调用?

这是我得到的:

In getBase()    
Base default constructor ...
Base int constructor: 2
In getBase()
Base default constructor ...
Base destructor: 100
Base destructor: 2
Base destructor: 100

您可以使用std::move()方法:

Base b4 = std::move(getBase());

这确保了move构造函数被调用,但在这一行中,它防止了复制省略,从而优化了复制构造函数。不需要调用任何构造函数,所以这是如何不使用std::move()的更多示例。