Неправильная реализация для regex_constants в clang? - PullRequest
8 голосов
/ 08 июня 2019

Как указано в стандарте :

match_prev_avail: --first является допустимой позицией итератора.Когда установлено, заставляет match_not_bol и match_not_bow игнорироваться

Но я запускаю следующий код и получаю:

#include <regex>
#include <iostream>
using namespace std;

int main()
{
    regex re0("^bcd");
    string str = "abcd";
    std::string::iterator start = str.begin() + 1;
    cout << regex_search(start, str.end(), re0, regex_constants::match_not_bol) << endl;
    cout << regex_search(start, str.end(), re0, regex_constants::match_prev_avail) << endl;
    cout << regex_search(start, str.end(), re0, regex_constants::match_prev_avail | regex_constants::match_not_bol) << endl;
}

output:

0
1
0

Кажется, что match_prev_avail перезаписывается match_not_bol.

1 Ответ

6 голосов
/ 08 июня 2019

Кажется, вы нашли ошибку в Clang.(подайте это здесь: https://bugs.llvm.org/, поскольку это, кажется, еще не было сообщено)

Я проверил MSVC 1914, и он выдает

0
0
0

так же, как GCC 4.9.2 (используетсяcpp.sh для проверки)

Я перепроверил .pdf форму стандарта (N4810), и это в 30.5.2 соответствует тому, что cppreference заявляет.

match_prev_avail: --first - допустимая позиция итератора.Когда этот флаг установлен, флаги match_not_bol и match_not_bow должны игнорироваться алгоритмами регулярных выражений (30.11) и итераторами (30.12)

...