Подтвердить что ты не робот

Почему различные установки 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

ideone (и, кстати, Coliru clang 3.5.0 с помощью libС++)

match1
match2
match3

Есть ли в моем коде поведение undefined или что-то еще? Что может вызвать это?

4b9b3361

Ответ 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. Джозеф Мэнсфилд определил, что эти конкретные симптомы в этом конкретном случае вызваны пошаговым приращением, по крайней мере.