Когда 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?
Ответы
Ответ 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.