2016-11-04 12 views
13

Theo cppreference, std::string_view::operator== là constexpr. Tôi gặp khó khăn trong việc tìm kiếm một tình huống cho điều này là đúng với việc triển khai thư viện hiện tại.Khi nào là std :: string_view :: operator == thực sự constexpr?

Đây là những gì tôi đã cố gắng:

#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); 
} 

Với gcc-cốp, điều này không biên dịch bởi vì trong libstdC++ toán tử == không constexpr ở tất cả.

Với clang-trunk này cũng không thành công vì toán tử ==() được khai báo constexpr, nhưng sử dụng char_traits :: compare() không phải là constexpr.

Các lỗi này có nằm trong thư viện chuẩn không? Hay là kỳ vọng của tôi sai?

Nếu kỳ vọng của tôi sai, thì làm cách nào tôi có thể xây dựng chuỗi_view có thể được so sánh với constexpr?

+5

Đoán rằng không có trình biên dịch nào tuân thủ đầy đủ C++ 17. Một phần vì mục tiêu vẫn đang chuyển động và ủy ban có [cuộc họp vào tuần tới] (https://isocpp.org/blog/2016/07/n4608) để sắp xếp mọi thứ. –

+0

Việc triển khai hiện tại có thể sử dụng 'char_traits :: compare' để so sánh. Nó sẽ hoạt động nhanh hơn vòng lặp thủ công khi chạy. Nó có thể có thể được thực hiện với một số nội tại. – DeiDei

+0

Theo [N3762] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3762.html), 'toán tử == 'được khai báo không có' constexpr'. – kakkoko

Trả lời

11

string_view::operator== sử dụng char_traits<CharT>::compare để so sánh. std::char_traits<char>::compare không phải là constexpr, do đó, operator == không phải là constexpr.

Nếu bạn sử dụng triển khai char_traits thực hiện một constexpr compare, thì so sánh sẽ là constexpr.

Lưu ý rằng có một bài báo trước ủy ban tiêu chuẩn đề xuất làm cho các phương thức std::char_traits<>::compare (và các phương thức khác của lớp đó) constexpr.

+4

Giữ các ngón tay của tôi vượt qua cho bài báo đó! Bạn có biết về việc triển khai thực hiện 'char_traits' đã thực hiện một' so sánh' contexpr không? – Rumburak

+1

Viết của riêng bạn ;-). Nghiêm túc, tôi đã phải viết một tối thiểu cho tăng :: kiểm tra string_view và nó đã cho tôi khoảng 20 phút. –

+1

P0426R1 đã được chấp nhận, libstdC++ thực hiện nó trong thân cây, tiếc là string_view chính nó vẫn còn sai thực hiện với rất nhiều thiếu constexpr. –

Các vấn đề liên quan