C'est la même chose.
#include <cassert> #include <optional> struct Version { Version() {} uint32_t major = 0; uint32_t minor = 0; uint32_t patch = 0; }; int main() { std::optional<int> o1 = {}; std::optional<int> o2 = 1; std::optional<Version> o3 = {}; std::optional<Version> o4 = {{}}; assert(!o1); assert(o2); assert(!o3); assert(o4); }
std::optional - construct empty with {} or std::nullopt? Archive du 16/09/2019 le 01/02/2023
std::make_optional
force la création d'un optional alors que std::optional peut copier un optional.
#include <optional> #include <type_traits> int main() { auto inner=std::make_optional(325); auto opt2=std::make_optional(inner); // makes std::optional<std::optional<int>> auto opt3=std::optional(inner); // just a copy of inner static_assert(std::is_same_v<decltype(opt2), std::optional<std::optional<int>>>); static_assert(std::is_same_v<decltype(opt3), std::optional<int>>); }
What is the point of `std::make_optional` Archive du 04/07/2020 le 14/03/2023
Il faut spécifier explicitement l'optional.
std::optional<int> t; t = true ? 1 : std::optional<int>{std::nullopt};