移动构造函数之前析构函数被调用了吗?

4

我有一个函数,大概长这样,它通过移动语义返回一个不可复制的类:

MyClass&& MyFunction() {
  MyClass myClass;
  do some stuff;
  return std::move(myClass);
}

然后它被访问

main() {
  MyClass myClass = MyFunction();
}

该类利用boost::noncopyable实现复制预防。它具有构造函数、移动构造函数和移动赋值。我的问题是,在移动构造函数之前,析构函数被调用了。我做错了什么?
1个回答

5
你正在返回一个局部变量的引用。无论是左值引用还是右值引用都无所谓。
你可能应该只需执行以下操作:
MyClass MyFunction() {
  MyClass myClass;
  do some stuff;
  return myClass;
}

让编译器自行决定如何复制或移动结果。


我认为你明确地返回了rvalue。 - Viktor Sehr
1
是的,早在之前就有这个预期。后来发现这并不完全正确。请参见想要速度?传递值 - Bo Persson
1
编译器在这种情况下将始终移动 myClass - Puppy
2
@BoPersson:在这种情况下,我并不是在寻求速度,实际上该类处理硬件资源,不能被复制。我只想跳过返回指针\智能指针的步骤。 - Viktor Sehr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接