diff options
Diffstat (limited to 'boost/hana/ext/std/array.hpp')
-rw-r--r-- | boost/hana/ext/std/array.hpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/boost/hana/ext/std/array.hpp b/boost/hana/ext/std/array.hpp index 0cb513073c..59bc49cf8d 100644 --- a/boost/hana/ext/std/array.hpp +++ b/boost/hana/ext/std/array.hpp @@ -149,13 +149,21 @@ BOOST_HANA_NAMESPACE_BEGIN ////////////////////////////////////////////////////////////////////////// template <> struct less_impl<ext::std::array_tag, ext::std::array_tag> { - template <typename T, typename U> - static constexpr auto apply(std::array<T, 0> const&, std::array<U, 0> const&) - { return hana::false_c; } - template <typename T, std::size_t n, typename U, std::size_t m> static constexpr auto apply(std::array<T, n> const& xs, std::array<U, m> const& ys) { - return detail::lexicographical_compare(&xs[0], &xs[0] + n, &ys[0], &ys[0] + m); + // This logic is more complex than it needs to be because we can't + // use `.begin()` and `.end()`, which are not constexpr in C++14, + // and because `&arr[0]` is UB when the array is empty. + if (xs.empty()) { + return !ys.empty(); + } else { + if (ys.empty()) { + return false; + } else { + return detail::lexicographical_compare(&xs[0], &xs[0] + n, + &ys[0], &ys[0] + m); + } + } } }; BOOST_HANA_NAMESPACE_END |