Fix constexpr emplace on clang and msvc-14.1

This commit is contained in:
Peter Dimov
2017-06-09 02:27:02 +03:00
parent 0997734e5c
commit 613d411396

View File

@@ -311,12 +311,12 @@ template<class T1, class... T> union variant_storage_impl<mp_false, T1, T...>
{
}
template<class... A> void emplace( mp_size_t<0>, A&&... a ) noexcept
template<class... A> void emplace( mp_size_t<0>, A&&... a )
{
::new( &first_ ) T1( std::forward<A>(a)... );
}
template<std::size_t I, class... A> void emplace( mp_size_t<I>, A&&... a ) noexcept
template<std::size_t I, class... A> void emplace( mp_size_t<I>, A&&... a )
{
rest_.emplace( mp_size_t<I-1>(), std::forward<A>(a)... );
}
@@ -342,26 +342,26 @@ template<class T1, class... T> union variant_storage_impl<mp_true, T1, T...>
{
}
template<class... A> void emplace_impl( mp_false, A&&... a ) noexcept
template<class... A> void emplace_impl( mp_false, mp_size_t<0>, A&&... a )
{
::new( &first_ ) T1( std::forward<A>(a)... );
}
template<class... A> constexpr void emplace_impl( mp_true, A&&... a ) noexcept
{
*this = variant_storage_impl( mp_size_t<0>(), std::forward<A>(a)... );
}
template<class... A> constexpr void emplace( mp_size_t<0>, A&&... a ) noexcept
{
this->emplace_impl( mp_all<std::is_trivially_move_assignable<T1>, std::is_trivially_move_assignable<T>...>(), std::forward<A>(a)... );
}
template<std::size_t I, class... A> constexpr void emplace( mp_size_t<I>, A&&... a ) noexcept
template<std::size_t I, class... A> constexpr void emplace_impl( mp_false, mp_size_t<I>, A&&... a )
{
rest_.emplace( mp_size_t<I-1>(), std::forward<A>(a)... );
}
template<std::size_t I, class... A> constexpr void emplace_impl( mp_true, mp_size_t<I>, A&&... a ) noexcept
{
*this = variant_storage_impl( mp_size_t<I>(), std::forward<A>(a)... );
}
template<std::size_t I, class... A> constexpr void emplace( mp_size_t<I>, A&&... a )
{
this->emplace_impl( mp_all<std::is_trivially_move_assignable<T1>, std::is_trivially_move_assignable<T>...>(), mp_size_t<I>(), std::forward<A>(a)... );
}
constexpr T1& get( mp_size_t<0> ) noexcept { return first_; }
constexpr T1 const& get( mp_size_t<0> ) const noexcept { return first_; }