Как использовать std::swap внутри constexpr функции?

std::swap является constexpr, начиная с c++20.

Поэтому я не могу использовать его в таком случае

struct sortable {
    // ...
     
    sortable(int a, int b) : _array({a, b}){
    }         
     
    // Функция является constexpr в c++17.
    template<class T>
    CONSTEXPR_17 void sort(T& first, T& last){
      // ...
      if(*last < *first) {
        std::swap(*first, *last); // Error. Не является constexpr в c++17.
      }
    }

    std::array<int, 2> _array;
};

Вместо этого мне нужно писать так:

struct sortable {
    template<class T>
    CONSTEXPR_17 void sort(T& first, T& last){
      // ...
      if(*last < *first) {
        // swap
        auto tmp = std::move(*first);
        *first   = std::move(*last);
        *last    = std::move(tmp);
      }
    }
};

Есть ли какой-то более элегантный способ?


Ответы (0 шт):