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?
复制省略不会帮助你,因为它是一种优化,可能会或可能不会被应用。
移动语义确实有帮助,并且您可以保证在局部变量的函数返回中移动。但是这意味着你必须编写移动构造函数,你必须修改析构函数,以便它不解锁是从移动对象的资源。
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |