在破坏的对象上移动构造函数?

Move constructor on destructed object?

我有一段代码

#include <iostream>

class A {
public:
    A() {
        std::cout << "Default constructor" << std::endl;
    }
    A(const A & other)
    {
        std::cout << "Copy constructor" << std::endl;
    }
    A(A && other)
    {
        std::cout << "Move constructor" << std::endl;
    }
    ~A()
    {
        std::cout << "Destructor" << std::endl;
    }
private:
    int i;
};

A && f()
{
    return A();
}

int main() {
    A a = f();
}

我试了运行,结果是

Default constructor
Destructor
Move constructor 
Destructor

我的问题是为什么析构函数在移动的构造函数之前被调用?这是否也意味着第二个对象是用销毁值构造的?

第一个 A 对象是在 f 的调用堆栈框架中创建的。因此,当 f returns 控制 main 时,所有在 f 中创建的堆栈对象都必须被销毁。这就是第一个析构函数被调用的原因。

A && f() 返回一个局部变量与 A & f() 有同样的问题。它们都是参考。当你在main()中构造a时,局部变量已经被销毁了。这会导致引用已销毁的实例,从而导致未定义的行为。

如果您想将 A()f() 移动到 main 中的 a,只需按值 return。尝试使用以下内容:

A f() {
    return A();
}