2016-07-05 2 views
0

Я пытаюсь понять поведение следующего кода.Результат std :: regex_match кажется неправильным

Я думаю, что это может быть ошибка, так как результат выглядит неправильно для меня.

#include <iostream> 
#include <regex> 

int main(int ac, char **av) 
{ 
    std::regex reg("lib(.*)\\.so"); 
    std::smatch match; 
    std::cout << std::regex_match(std::string("libscio.so"), match, reg) << std::endl; 
    std::cout << match.str(1) << std::endl; 

    return 0; 
} 

Я ожидаю

1 
scio 

Но это дает мне

1 
ocio 

Собран с GCC версии 4.9.2 (Debian 4.9.2-10) на x86_64 GNU/Linux

+5

Возможно, что-то связано с [этим] (http://stackoverflow.com/questions/33154890/simple-stdregex-search-code-wont-compile-with-apple-clang-std-c14)? – LogicStuff

+2

Какую стандартную версию вы скомпилировали? Как отмечено в ссылке @ LogicStuff, которая отвечает на это, передача _rvalue_ была UB в C++ 11, и по этой причине теперь запрещено в C++ 14. –

ответ

2

Мне пришлось структурировать программу по-другому, потому что она не будет компилироваться иначе в VS 2015. Возможно, это вызывает вашу проблему, когда y наш компилятор тоже? Обратите внимание на временную переменную строки.

#include <iostream> 
#include <regex> 

int main(int ac, char **av) 
{ 
    std::regex reg("lib(.*)\\.so"); 
    std::smatch match; 
    std::string target = "libscio.so"; 
    std::cout << std::regex_match(target, match, reg) << std::endl; 
    std::cout << match.str(1) << std::endl; 

    return 0; 
} 

Это дает 1 и scio в VS 2015, как и ожидалось.

Согласно сообщению the link @LogicStuff, это связано с тем, что передача во временном объекте означает, что совпадение указывает на итераторы, которые недействительны, когда временное значение выходит за пределы области видимости. Таким образом, вероятно, вы видите, что мусор остался, когда ваша временная строка была удалена.

Смежные вопросы