对移动构造函数的误解

Ant*_*ton 0 c++ constructor class move

我有这样的课程,我在其中创建了一个move constructor

class Test
{
private:
    int m_a;

public:
    Test(int val) { m_a = val; }

    Test (const Test &) {}
    
    // move constructor
    Test (Test && d)
    {
        std::cout << &m_a << std::endl;   // Line X
        std::cout << &d.m_a << std::endl;
    }

    void print()
    {
        std::cout << m_a << std::endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

我还创建了一个函数来测试move constructor

void fun(Test a)
{ return ; }
Run Code Online (Sandbox Code Playgroud)

比在main函数中我创建上面类的 2 个对象并调用函数来测试move constructor

int main()
{
    Test a {50};
    Test b {100};

    fun(a);
    fun(std::move(a));

    fun(b);
    fun(std::move(b));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我查看输出时,我很惊讶,因为 om_a变量的地址line X对于两个对象具有相同的地址。

0x7ffc40d37bb4   // look at this
0x7ffc40d37bac
0x7ffc40d37bb4   // look at this
0x7ffc40d37bb0
Run Code Online (Sandbox Code Playgroud)

这怎么可能 ?它不是静态成员,这是怎么回事?编译器优化还是什么?

rus*_*tyx 5

每次fun(Test a)调用时,Test都会在堆栈上创建一个实例。每次fun()返回时,栈帧都会被释放。

因此,当连续调用两次时,您很有可能Test在堆栈上完全相同的位置获得一个 create 的实例。

如果你想Test参考的话,应该是void fun(Test&& a)