Мне просто интересно, полезно ли возвращать std::optional
из функции, созданной с использованием std::in_place
? Должен ли я делать это вслепую или что-либо меняет удаление копирования/изменение версий C++/структура данных, которую можно легко построить/разрушить?
Конструктор на месте полезен, когда класс нельзя копировать или перемещать. Например:
#include <mutex>
#include <optional>
struct T { T(int, int); std::mutex m; };
std::optional<T> f() {
// return T(1, 2); // Error: T not movable
// return std::make_optional(T(1, 2)); // Error: T not movable
return std::optional<T>(std::in_place, 1, 2); // works
}
В противном случае, если у вас уже есть желаемое возвращаемое значение и тип является подвижным, вы можете просто использовать «обычный» конструктор из типа:
T x = ...;
// ...
return x;
Возможно, было бы немного необычно писать это как return std::optional<T>(std::in_place, x);
, хотя бы потому, что оно без необходимости повторяет имя типа.
Наверное это видео будет полезно Джейсон Тернер Ep 421