c – RAII和工厂设计模式?
作者:互联网
假设我有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并移动语义?例如,不要在移动的foo中调用unblock_resource,但我不确定是否保证使用移动构造函数/ operator =从Foo :: create返回?
解决方法:
复制elision对您没有帮助,因为它是一种优化,可能会也可能不会应用.
移动语义确实有帮助,并且您可以在函数返回局部变量时得到保证.但这意味着您必须编写移动构造函数,并且必须修改析构函数,以便它不会解锁移动的对象的资源.
标签:copy-elision,c,c11,factory,c17 来源: https://codeday.me/bug/20190724/1522128.html