Мне было интересно, можно ли считать это допустимым использование std::optional
Да, да, да - это то, для чего std::optional
!
было бы более эффективно возвращать 0, если мы потерпим неудачу
Технически да, std::optional
- это обертка, поэтому она имеет небольшие накладные расходы.Однако вероятность того, что это является узким местом в производительности вашего кода, чрезвычайно мала.Если вы не уверены, создайте тест и сравните две версии вашей функции.
В настоящее время я делаю это при возврате unique_ptr, но я не уверен, будет ли это рассматриваться как "злоупотребление"упомянутая особенность
Это действительно не предполагаемый, идиоматический вариант использования для std::unique_ptr
.Читатели вашего кода ожидают, что std::unique_ptr
будет обрабатывать исключительное владение некоторым (возможно, полиморфным) объектом.Также не существует много допустимых сценариев для вставки примитивного целочисленного типа в интеллектуальный указатель, и не рекомендуется использовать std::unique_ptr
для варианта использования, который идеально подходит для std::optional
.