在破坏的对象上移动构造函数?
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();
}
我有一段代码
#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();
}