Подтвердить что ты не робот

Когда std:: string_view:: operator == действительно constexpr?

Согласно cppreference, std::string_view::operator== является constexpr. У меня возникли проблемы с поиском ситуации, чтобы это было верно при реализации текущей библиотеки.

Вот что я пробовал:

#include <string_view>

constexpr char x0[] = "alpha";
constexpr char y0[] = "alpha";
constexpr auto x = std::string_view(x0, 5);
constexpr auto y = std::string_view(y0, 5);

constexpr auto a = std::string_view("alpha", 5);
constexpr auto b = std::string_view("alpha", 5);

int main()
{
  // a, b, x, y are all constexpr, operator== is constexpr
  // therefore I expected this to compile:
  static_assert(x == y);
  static_assert(a == b);
}

С gcc-trunk это не скомпилируется, потому что в libstdС++ оператор == не является constexpr вообще.

С clang-trunk это также терпит неудачу, потому что оператор ==() объявлен constexpr, но использует char_traits:: compare(), который не является constexpr.

Являются ли эти ошибки в стандартных библиотеках? Или мои ожидания ошибочны?

Если мои ожидания ошибочны, то как я могу построить string_view, который может быть constexpr-compare?

4b9b3361

Ответ 1

string_view::operator== использует char_traits<CharT>::compare для сравнения. std::char_traits<char>::compare не constexpr, поэтому operator == не constexpr.

Если вы используете реализацию char_traits, которая реализует constexpr compare, тогда сравнение будет constexpr.

Обратите внимание, что перед комитетом по стандартам есть статья, в которой предлагается сделать std::char_traits<>::compare (и другие методы этого класса) constexpr.