+2016-12-16 Ville Voutilainen <ville.voutilainen@gmail.com>
+
+ Implement LWG 2769, Redundant const in the return type of
+ any_cast(const any&).
+ * include/std/any (_AnyCast): New.
+ (any_cast(const any&)): Use it and add an explicit cast for return.
+ (any_cast(any&)): Likewise.
+ (any_cast(any&&)): Likewise.
+ * testsuite/20_util/any/misc/any_cast.cc: Add a test for a type
+ that has an explicit copy constructor.
+ * testsuite/20_util/any/misc/any_cast_neg.cc: Adjust.
+
2016-12-15 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/59170
return any(in_place_type<_Tp>, __il, std::forward<_Args>(__args)...);
}
+ template <typename _Tp>
+ using _AnyCast = remove_cv_t<remove_reference_t<_Tp>>;
/**
* @brief Access the contained object.
*
{
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<add_const_t<remove_reference_t<_ValueType>>>(&__any);
+ auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
if (__p)
- return *__p;
+ return static_cast<_ValueType>(*__p);
__throw_bad_any_cast();
}
{
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<remove_reference_t<_ValueType>>(&__any);
+ auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
if (__p)
- return *__p;
+ return static_cast<_ValueType>(*__p);
__throw_bad_any_cast();
}
{
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<remove_reference_t<_ValueType>>(&__any);
+ auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
if (__p)
- return *__p;
+ return static_cast<_ValueType>(*__p);
__throw_bad_any_cast();
}
{
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<remove_reference_t<_ValueType>>(&__any);
+ auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
if (__p)
- return std::move(*__p);
+ return static_cast<_ValueType>(std::move(*__p));
__throw_bad_any_cast();
}
// @}
MoveDeleted&& md3 = any_cast<MoveDeleted&&>(any(std::move(md)));
}
+void test04()
+{
+ struct ExplicitCopy
+ {
+ ExplicitCopy() = default;
+ explicit ExplicitCopy(const ExplicitCopy&) = default;
+ };
+ any x = ExplicitCopy();
+ ExplicitCopy ec{any_cast<ExplicitCopy>(x)};
+ ExplicitCopy ec2{any_cast<ExplicitCopy>(std::move(x))};
+}
+
int main()
{
test01();
test02();
test03();
+ test04();
}