【发布时间】:2016-11-04 10:00:20
【问题描述】:
根据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,但使用了不是 constexpr 的 char_traits::compare()。
这些错误是否在标准库中?还是我的期望错了?
如果我的期望是错误的,那么我该如何构造一个可以进行 constexpr 比较的 string_view?
【问题讨论】:
-
猜猜没有编译器完全兼容 C++17。部分原因是目标仍在移动,委员会有一个meeting next week 来解决问题。
-
当前的实现可能使用
char_traits<CharT>::compare来进行比较。它在运行时比手动循环运行得更快。它可能可以通过一些内在函数来完成。 -
constexpr与 C 库如何交互的问题在很大程度上仍未解决,可能还会有一些变化。 -
参见P0426 和链接的 LWG 问题。
-
@kakkoko 我找到的最新版本是N3921。这里 operator== 被声明为 constexpr