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) {}
};
我是对的并且不能保证~Foo在这样的块中只会被调用一次吗?
{
   Foo foo = Foo::create();
   foo.f();
}
如果没有保证,如果使用 c++11 和移动语义是否有可能以某种方式修复?例如,不调用unblock_resource移动的 foo,但我不确定是否保证使用移动构造函数/运算符 = 来返回Foo::create?
复制省略不会帮助你,因为它是一种优化,可能会或可能不会被应用。
移动语义确实有帮助,并且您可以保证在局部变量的函数返回中移动。但是这意味着你必须编写移动构造函数,你必须修改析构函数,以便它不解锁是从移动对象的资源。
| 归档时间: | 
 | 
| 查看次数: | 940 次 | 
| 最近记录: |