std::optional#

Introduced in C++17, std::optional provides C++ code an additional way (besides pointers) to return values from functions that may not be set.

Since Ruby does not have an equivalent type, Rice unwraps std::optional instances. If the optional is empty, thus has a value of std::nullopt, Rice converts it to nil in Ruby. If the optional has a value, and that value is a Builtin type, then it will be converted to the appropriate Ruby type. If it is not a Builtin type, then the value will be wrapped by Ruby.

When passing a Ruby instance to std::optional, Rice will convert nil values to std::nullopt and non nil values to the appropriate C++ type.