почему это не обычное место для использования boost :: optional в качестве scoped_ptr, кажется, что это лучше, поскольку объект создается в стеке, а не в куче. Но я никогда не видел, чтобы это использовалось таким образом. Мой вопрос: каковы недостатки использования boost :: optional как разновидности scoped_ptr, кроме очевидной неспособности выполнять полиморфизм?
почему бы не использовать boost :: optional как лучший scoped_ptr
Ответы (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
}
}
Во-первых, я бы сказал семантику.
Мне нужно освежить память о деталях boost::optional
и boost::scoped_ptr
, чтобы высказать мнение о техническом аспекте, но когда дело доходит до ремонтопригодности, использование optional
вместо указателей обязательно сбивает с толку людей, читающих ваш код.