【问题标题】:When is std::string_view::operator== really constexpr?什么时候 std::string_view::operator== 真的是 constexpr?
【发布时间】:2016-11-04 10:00:20
【问题描述】:

根据cppreferencestd::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&lt;CharT&gt;::compare 来进行比较。它在运行时比手动循环运行得更快。它可能可以通过一些内在函数来完成。
  • constexpr 与 C 库如何交互的问题在很大程度上仍未解决,可能还会有一些变化。
  • 参见P0426 和链接的 LWG 问题。
  • @kakkoko 我找到的最新版本是N3921。这里 operator== 被声明为 constexpr

标签: c++ gcc c++17 libc++


【解决方案1】:

string_view::operator== 使用char_traits&lt;CharT&gt;::compare 进行比较。 std::char_traits&lt;char&gt;::compare 不是 constexpr,所以 operator == 不是 constexpr。

如果您使用实现 constexpr comparechar_traits 的实现,则比较将是 constexpr。

请注意,标准委员会面前有一篇论文提议将std::char_traits&lt;&gt;::compare(和该类的其他方法)设为constexpr。

【讨论】:

  • 为那篇论文祈祷!您是否知道已经实现了上下文 comparechar_traits 的可用实现?
  • 写你自己的;-)。说真的,我必须为 boost::string_view 测试写一个最小的,我花了大约 20 分钟。
  • P0426R1 被接受,libstdc++ 在主干中实现它,不幸的是 string_view 本身仍然是错误的,因为缺少很多 constexpr。
猜你喜欢
  • 2015-10-19
  • 2020-03-24
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
相关资源
最近更新 更多