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?
Đ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ứ. –
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
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