首页 > 解决方案 > 为什么在 C++11 中调用了复制构造函数而不是移动构造函数?

问题描述

这是我做的 C++ 测试。我认为会调用移动构造函数,但事实并非如此。这两种情况都不会调用移动构造。

class MyTest
{
public:
    MyTest() {}
    ~MyTest() {}
    MyTest(const MyTest& lv) {}     // be called actually 
    MyTest(MyTest&& rv) {}          // not be called actually, but i thought would
    void operator=(const MyTest& lv) {
        MyTest(std::move(lr));      // i thought the move constructor would be called here
    }
};
int main()
{
    // case1:
    MyTest m1;
    MyTest m2 = m1;

    // case2:
    MyTest m3;
    MyTest m4;
    m4 = m3;       // move constructure will not be called either.
    return 0;
}

标签: c++c++11

解决方案


您的复制分配运算符

void operator=(const MyTest& lv) {
    MyTest(std::move(lr));
}

三个问题:

  1. 参数已命名lv,但您lr在函数内部使用;

  2. 参数lv是对常量 MyTest对象的引用,它不能被“移动”;

  3. 和声明

    MyTest(std::move(lv));  // Corrected the variable name
    

    本身没有多大意义。

    它通过右值初始化创建一个临时对象。但是由于不再使用该对象,编译器可以自由地对其进行优化,从而使赋值运算符的主体为空。

    如果您查看生成的代码,您很可能会看到缺少对象创建。


推荐阅读