Почему различные установки GCC 4.9.2 дают разные результаты для этого регулярного выражения?
Я разместил следующий код на ideone и Coliru:
#include <iostream>
#include <regex>
#include <string>
int main()
{
std::string example{" <match1> <match2> <match3>"};
std::regex re{"<([^>]+)>"};
std::regex_token_iterator<std::string::iterator> it{example.begin(), example.end(), re, 1};
decltype(it) end{};
while (it != end) std::cout << *it++ << std::endl;
return 0;
}
Оба сайта используют GCC 4.9.2. Я не знаю, какие компиляционные аргументы использует ideone, но в Coliru нет ничего необычного.
Coliru не дает мне результат match1
:
Coliru
# g++ -v 2>&1 | grep version; \
# g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
gcc version 4.9.2 (GCC)
match2
match3
match1
match2
match3
Есть ли в моем коде поведение undefined или что-то еще? Что может вызвать это?
Ответы
Ответ 1
Это ошибка в libstdС++ regex_token_iterator
конструктор копирования, называемый оператором postincrement. Ошибка была исправлена в декабре 2014 года; версии gcc 4.9 и 5.x, выпущенные с тех пор, будут иметь исправление. Характер ошибки заключается в том, что копия итератора псевдонизирует цель копии, что приводит к наблюдаемому поведению.
Обходной путь заключается в использовании преинкремента - это желательно также с точки зрения микрооптимизации, поскольку regex_token_iterator
является достаточно тяжелым классом:
for (; it != end; ++it) std::cout << *it << std::endl;
Ответ 2
Код действителен.
Единственное правдоподобное объяснение заключается в том, что версии стандартной библиотеки отличаются; хотя по большей части стандартные реализации библиотеки поставляются вместе с компиляторами, их можно модернизировать независимо через, скажем, менеджер пакетов Linux.
В этом случае кажется, что это ошибка libstdС++, которая была исправлена в конце прошлого года:
Самый вероятный матч с Bugzilla, который я могу найти, ошибка 63497, но, честно говоря, я не уверен в этой конкретной ошибке был когда-либо полностью покрыт Bugzilla. Джозеф Мэнсфилд определил, что эти конкретные симптомы в этом конкретном случае вызваны пошаговым приращением, по крайней мере.