}
}
+ common_iterator(const common_iterator&) = default;
+
constexpr
common_iterator(const common_iterator& __x)
noexcept(_S_noexcept<const _It&, const _Sent&>())
+ requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>)
: _M_valueless(), _M_index(__x._M_index)
{
if (_M_index == 0)
}
}
+ common_iterator(common_iterator&&) = default;
+
constexpr
common_iterator(common_iterator&& __x)
noexcept(_S_noexcept<_It, _Sent>())
+ requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>)
: _M_valueless(), _M_index(__x._M_index)
{
if (_M_index == 0)
return *this;
}
+#if __cpp_concepts >= 202002L // Constrained special member functions
+ ~common_iterator() = default;
+
constexpr
~common_iterator()
+ requires (!is_trivially_destructible_v<_It>
+ || !is_trivially_destructible_v<_Sent>)
+#else
+ constexpr
+ ~common_iterator()
+#endif
{
if (_M_index == 0)
_M_it.~_It();
#include <testsuite_hooks.h>
void
+test_triviality()
+{
+ using I = std::common_iterator<int*, const int*>;
+
+ // Cannot be trivial, because it has to initialize members.
+ static_assert( ! std::is_trivially_default_constructible_v<I> );
+
+ static_assert( std::is_trivially_destructible_v<I> );
+ static_assert( std::is_trivially_copy_constructible_v<I> );
+ static_assert( std::is_trivially_copy_assignable_v<I> );
+ static_assert( std::is_trivially_move_constructible_v<I> );
+ static_assert( std::is_trivially_move_assignable_v<I> );
+}
+
+void
test_valueless_assignment()
{
int x[1] { };