std::string_view::operator== 什么时候才是真正的 constexpr?
When is std::string_view::operator== really 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,这不会编译,因为在 libstdc++ 中,operator== 根本不是 constexpr。
对于 clang-trunk,这也会失败,因为 operator==() 被声明为 constexpr,但使用的 char_traits::compare() 不是 constexpr。
这些错误是标准库中的吗?还是我的期望错了?
如果我的期望是错误的,那么我如何构造一个可以进行 constexpr 比较的 string_view?
string_view::operator==
使用 char_traits<CharT>::compare
进行比较。 std::char_traits<char>::compare
不是 constexpr,所以 operator ==
不是 constexpr。
如果您使用实现 constexpr compare
的 char_traits
实现,则比较将为 constexpr。
请注意,标准委员会面前有一篇论文建议制作 std::char_traits<>::compare
(以及 class 的其他方法)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,这不会编译,因为在 libstdc++ 中,operator== 根本不是 constexpr。
对于 clang-trunk,这也会失败,因为 operator==() 被声明为 constexpr,但使用的 char_traits::compare() 不是 constexpr。
这些错误是标准库中的吗?还是我的期望错了?
如果我的期望是错误的,那么我如何构造一个可以进行 constexpr 比较的 string_view?
string_view::operator==
使用 char_traits<CharT>::compare
进行比较。 std::char_traits<char>::compare
不是 constexpr,所以 operator ==
不是 constexpr。
如果您使用实现 constexpr compare
的 char_traits
实现,则比较将为 constexpr。
请注意,标准委员会面前有一篇论文建议制作 std::char_traits<>::compare
(以及 class 的其他方法)constexpr。