2016-11-04 44 views
13

根据cppreferencestd::string_view::operator==是constexpr。在当前的库实现中,我无法找到这种情况。什么时候是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-干线,这并不因为++的libstdc操作编译==完全不constexpr。

使用clang-trunk时,这也失败了,因为operator ==()被声明为constexpr,但使用char_traits :: compare()而不是constexpr。

标准库中存在这些错误吗?或者我的期望错了?

如果我的期望错了,那我该如何构造一个可以进行constexpr比较的string_view?

+5

猜测没有编译器完全符合C++ 17。部分原因是目标仍在移动,委员会下周举行了一次会议(https://isocpp.org/blog/2016/07/n4608)来解决问题。 –

+0

当前的实现可能使用'char_traits :: compare'来进行比较。它的运行速度比运行时的手动循环快。它可能可以用一些内在的东西来完成。 – DeiDei

+0

根据[N3762](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3762.html),'operator =='被声明为没有'constexpr'。 – kakkoko

回答

11

string_view::operator==使用char_traits<CharT>::compare来做比较。 std::char_traits<char>::compare不是constexpr,所以operator ==不是constexpr。

如果您使用的实施char_traits,实施constexpr compare,则比较将constexpr。

请注意,标准委员会前面有一篇论文,建议制定std::char_traits<>::compare(以及该类别的其他方法)。

+4

保持我的手指交叉纸!你知道'char_traits'的可用实现已经实现了一个contexpr'compare'吗? – Rumburak

+1

写你自己;-)。严重的是,我不得不为boost :: string_view测试编写一个最小的测试,并花了我大约20分钟。 –

+1

P0426R1被接受,libstdC++在trunk中实现它,不幸的是string_view本身仍然错误地执行了很多缺少的constexpr。 –

相关问题