void test_multi_arg() { test_one_arg<T>(); using Opt = std::optional<T>; { Opt opt; auto &v = opt.emplace(101, 41); static_assert( std::is_same_v<T&, decltype(v)>, "" ); assert(static_cast<bool>(opt) == true); assert( v == T(101, 41)); assert(*opt == T(101, 41)); } { Opt opt; auto &v = opt.emplace({1, 2, 3, 4}); static_assert( std::is_same_v<T&, decltype(v)>, "" ); assert(static_cast<bool>(opt) == true); assert( v == T(4)); // T sets its value to the size of the init list assert(*opt == T(4)); } { Opt opt; auto &v = opt.emplace({1, 2, 3, 4, 5}, 6); static_assert( std::is_same_v<T&, decltype(v)>, "" ); assert(static_cast<bool>(opt) == true); assert( v == T(5)); // T sets its value to the size of the init list assert(*opt == T(5)); // T sets its value to the size of the init list } }
void test_one_arg() { using Opt = std::optional<T>; { Opt opt; auto & v = opt.emplace(); static_assert( std::is_same_v<T&, decltype(v)>, "" ); assert(static_cast<bool>(opt) == true); assert(*opt == T(0)); assert(&v == &*opt); } { Opt opt; auto & v = opt.emplace(1); static_assert( std::is_same_v<T&, decltype(v)>, "" ); assert(static_cast<bool>(opt) == true); assert(*opt == T(1)); assert(&v == &*opt); } { Opt opt(2); auto & v = opt.emplace(); static_assert( std::is_same_v<T&, decltype(v)>, "" ); assert(static_cast<bool>(opt) == true); assert(*opt == T(0)); assert(&v == &*opt); } { Opt opt(2); auto & v = opt.emplace(1); static_assert( std::is_same_v<T&, decltype(v)>, "" ); assert(static_cast<bool>(opt) == true); assert(*opt == T(1)); assert(&v == &*opt); } }