почему бы не использовать boost :: optional как лучший scoped_ptr

почему это не обычное место для использования boost :: optional в качестве scoped_ptr, кажется, что это лучше, поскольку объект создается в стеке, а не в куче. Но я никогда не видел, чтобы это использовалось таким образом. Мой вопрос: каковы недостатки использования boost :: optional как разновидности scoped_ptr, кроме очевидной неспособности выполнять полиморфизм?


person dan    schedule 25.03.2014    source источник
comment
Что плохого в том, чтобы просто объявить нужную переменную, зачем оборачивать ее в boost :: optional?   -  person Cheers and hth. - Alf    schedule 25.03.2014
comment
У меня были такие же мысли. С точки зрения производительности boost :: optional превзойдет scoped_ptr. Единственный серьезный недостаток - это семантика (или отсутствие полиморфизма, как указывает milleniumbug).   -  person gast128    schedule 14.08.2017


Ответы (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
    }
}
person milleniumbug    schedule 25.03.2014
comment
Есть еще одна цель - иметь член, который можно создавать и уничтожать независимо от класса, членом которого он является. Может быть, ленивый инициализированный объект? - person dan; 25.03.2014

Во-первых, я бы сказал семантику.

Мне нужно освежить память о деталях boost::optional и boost::scoped_ptr, чтобы высказать мнение о техническом аспекте, но когда дело доходит до ремонтопригодности, использование optional вместо указателей обязательно сбивает с толку людей, читающих ваш код.

person executifs    schedule 25.03.2014
comment
Было бы полезно, если бы boost / std определял что-то вроде, например, value_ptr с той же реализацией, что и boost :: optional. - person gast128; 14.08.2017