On 01/06/17 18:21 +0300, Ville Voutilainen wrote:
On 1 June 2017 at 18:13, Jonathan Wakely <jwak...@redhat.com> wrote:
On 30/05/17 02:16 -0700, Tim Shen via libstdc++ wrote:
diff --git a/libstdc++-v3/include/std/variant
b/libstdc++-v3/include/std/variant
index b9824a5182c..f81b815af09 100644
--- a/libstdc++-v3/include/std/variant
+++ b/libstdc++-v3/include/std/variant
@@ -290,6 +290,53 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ref_cast<_Tp>(__t));
}
+ template<typename... _Types>
+ struct _Traits
+ {
+ static constexpr bool is_default_constructible_v =
+ is_default_constructible_v<typename _Nth_type<0,
_Types...>::type>;
+ static constexpr bool is_copy_constructible_v =
+ __and_<is_copy_constructible<_Types>...>::value;
+ static constexpr bool is_move_constructible_v =
+ __and_<is_move_constructible<_Types>...>::value;
+ static constexpr bool is_copy_assignable_v =
+ is_copy_constructible_v && is_move_constructible_v
+ && __and_<is_copy_assignable<_Types>...>::value;
+ static constexpr bool is_move_assignable_v =
+ is_move_constructible_v
+ && __and_<is_move_assignable<_Types>...>::value;
It seems strange to me that these ones end with _v but the following
ones don't. Could we make them all have no _v suffix?
Seems to me worth considering to rather make all of them have a _v suffix. :)
+ static constexpr bool is_dtor_trivial =
+ __and_<is_trivially_destructible<_Types>...>::value;
They all seem to be shortcuts for something::value, so it seems to me
logical to have
them all be _v.
The _v suffixes in the standard are there to distinguish std::foo from
std::foo_v, but we don't have that problem.
__variant::_Traits<T...>::foo is a unique name, we don't need the
suffix, it's just noise.