2016-07-05 4 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 

을 기대하고 있습니다 그러나 x86_64에 GNU/리눅스

에 GCC 버전 4.9.2 (데비안 4.9.2-10)로 컴파일 된 나에게

1 
ocio 

을 제공합니다

+5

[this] (http://stackoverflow.com/questions/33154890/simple-stdregex-search-code-wont-compile-with-apple-clang-std-c14)와 관련이 있습니다. – LogicStuff

+2

어떤 표준 버전으로 컴파일하셨습니까? 이것을 응답하는 @ LogicStuff의 링크에서 알 수 있듯이 _rvalue_를 전달하는 것은 C++ 11에서 UB 였으므로 이제는 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; 
} 

예상대로 VS2015에서 1 및 scio가 산출된다.

@LogicStuff가 게시 한 the link에 따르면 임시 객체를 전달하면 임시 영역이 범위를 벗어날 때 무효화되는 반복자를 가리키는 것을 의미하기 때문입니다. 따라서 임시 문자열이 삭제되었을 때 남은 쓰레기는 아마 알 수 있습니다.

관련 문제