为什么使用boost :: optional作为scoped_ptr并不常见,因为在堆栈而不是堆上创建对象似乎更好。但我从来没有见过这种方式。我的问题是,使用boost :: optional作为一种scoped_ptr除了明显无法进行多态之外有什么缺点?
答案 0 :(得分:2)
首先,我会说语义。
我需要在boost::optional
和boost::scoped_ptr
详细信息上刷新我的记忆,以便就技术方面发表意见,但在可维护性方面,使用optional
代替指针必然会使阅读代码的人感到困惑。
答案 1 :(得分:2)
原因是多态 是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
}
}