RAII 和工厂设计模式?

use*_*932 4 c++ factory copy-elision c++11 c++17

假设我有Foo课:

struct Resource {
  void block();
  void unblock();
};
struct Foo {
   static Foo create() {
      Resource resource;
      resource.block();
      return Foo{resource};
    }
   ~Foo() { resource.unblock(); }
   void f() {}
private:
   Resource resource;
   Foo(Resource resource): resource(resource) {}
};
Run Code Online (Sandbox Code Playgroud)

我是对的并且不能保证~Foo在这样的块中只会被调用一次吗?

{
   Foo foo = Foo::create();
   foo.f();
}
Run Code Online (Sandbox Code Playgroud)

如果没有保证,如果使用 c++11 和移动语义是否有可能以某种方式修复?例如,不调用unblock_resource移动的 foo,但我不确定是否保证使用移动构造函数/运算符 = 来返回Foo::create

Seb*_*edl 6

复制省略不会帮助你,因为它是一种优化,可能会或可能不会被应用。

移动语义确实有帮助,并且您可以保证在局部变量的函数返回中移动。但是这意味着必须编写移动构造函数,必须修改析构函数,以便它不解锁是从移动对象的资源。