1

为什么将 boost::optional 用作 scoped_ptr 并不常见,因为对象是在堆栈而不是堆上创建的,所以似乎更好。但我从未见过它以这种方式使用。我的问题是,除了明显无法进行多态性之外,使用 boost::optional 作为一种 scoped_ptr 的缺点是什么?

4

2 回答 2

3

原因是多态性. scoped_ptr否则,您只需在堆栈上本地声明变量。

int main()
{
    Class object(52, 25); //sample declaration, with constructor arguments passed
}

编辑1(回应评论中的其他信息):

boost::scoped_ptr实际上很少用于您描述的目的(主要是因为您无法复制或移动boost::scoped_ptr,使您将其存储在不可复制和不可移动的类中)。看起来这boost::optional很适合这个目的,但是......

请注意,本地使用boost::optional(即不从函数返回)几乎没有意义,因为您可以随意在堆栈上创建对象:

void another_function()
{
    if(some_condition())
    {
        Class object(0, 0); // create the object
        // use the object
    }
    else
    {
        // don't use the object
    }
}
于 2014-03-25T13:49:19.717 回答
2

一方面,我会说语义。

我需要刷新我的记忆boost::optionalboost::scoped_ptr细节才能对技术方面发表意见,但是在可维护性方面,使用optionals 代替指针势必会使阅读您的代码的人感到困惑。

于 2014-03-25T13:45:53.163 回答