如何限制构造对象寿命更长所需的变量范围?

Ann*_*inn 3 c++ scope api-design raii

我在堆栈上有一个对象需要另一个对象作为它的构造函数,如下所示:

{
    ObjectDef def(importantData);  // should die as soon as obj is created
    def.setOptionalData(100);

    Object obj(def);  // should live for the remainder of the function body
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我喜欢将变量def放在自己的范围内.这给了我"def"的名字,并且清楚地表明它不再有用了.

例如,result我想做的事情是obj:

// scope block
{
    int result = complexFunction() + anotherFunction();
    printf("the result is %i", result);
    doMoreThingsWithIt(result); 
}
// "result" is now gone
Run Code Online (Sandbox Code Playgroud)

但问题是,我无法在这里做到这一点,我可以看到.构造函数Object obj不能在范围之前,因为它是构造函数需要的def,并且它不能在范围内,因为obj需要存活的时间比def.

无论如何要将限制def的范围缩短obj,或者我应该接受它必须至少保持一定的范围?

mat*_*ort 8

你可以使用lambda:

Object obj{[&]{ ObjectDef def{importantData}; def.setOptionalData(100); return def; }()};
Run Code Online (Sandbox Code Playgroud)

如果ObjectDef经常需要它的可选数据集并且这是一种常见模式,请考虑添加一个构造函数,以ObjectDef允许设置可选数据或创建一个命名辅助函数来完成lambda在这里完成的工作.

  • @ginkner不,lambdas在这样使用时没有内存分配的任何开销 - 它们具有自动存储(在堆栈上分配)并且函数调用不是虚拟的,因此它相对于全局函数调用没有额外的开销.在实践中,任何支持lambdas的编译器都会在优化的构建中内联这样的代码,因此编写代码时不会像在问题中编写代码那样产生开销. (4认同)