2012-02-01 2 views
1

이 C++ 코드는 비주얼 스튜디오 2010에서 실패 : 첫 번째 루프 후C++의 함수 매개 변수에서 생성자를 사용하는 것이 안전합니까?


const sregex_iterator end; 
for (sregex_iterator match(origString.begin(), origString.end(), regex(regExPattern)); match != end; ++match) 
{ 
    useMatch(*match); 
} 

를 첫 번째 반복자 증가 (operator++) 디버거가 regex_iterator는 "고아"것을 나타내는 실패에.

나는 반신 반의 정규식 생성자를 발견 (I 어딘가에서 조각을 복사) 그리고 난이 함께 노력 : 이것은 완벽하게 작동


const sregex_iterator end; 
regex regexObj(regExPattern); 
for (sregex_iterator match(origString.begin(), origString.end(), regexObj); match != end; ++match) 
{ 
    useMatch(*match); 
} 

.

하지만 첫 번째 시도가 실패하는 이유는 무엇입니까? 나는 그것이 for 범위이거나 어쩌면 인라인 된 생성자와 iterator 생성자의 regex 매개 변수가 참조라는 사실을 가지고 있어야한다. ...

그러나 얼마 전에 stackoverflow에서 읽었을 때, 나는 기억한다. 내가 이해할 수있는 것들만 있고 C++에서 함수 매개 변수로 생성자를 사용하는 것이 안전한지 알고 싶습니다 (물론 new을 사용하지 않고).

+1

'const sregex_iterator end'를 초기화하지 않는 것이 맞습니까? – Chowlett

+1

@Chowlett : 네, 그것은 "end marker"반복자를 만드는 (직관적이지 않은) 방법입니다. –

답변

5

첫 번째 경우에는 정규 표현식이 임시 객체로 만들어지고 일치가 초기화 된 후 즉시 삭제됩니다. 전체 루프를 통해 확장되는 수명이 필요합니다.

+0

+1 : 정규화 된 패턴이 초기화 후 범위를 벗어날 가능성이 높습니다. –

+0

메서드 매개 변수에서 생성자를 호출하면 해당 호출의 범위 만 포함됩니까? 메서드가 매개 변수를 복사하는 경우 (또는 값으로 전달되는 경우), 그렇지 않습니까? 그리고 첫 번째 루프가 작동하는 이유는 무엇입니까? ++ –

+0

연산자 하나만 더 : 한 가지 더 : 당신이 옳다면 (그리고 나는 당신이라고 생각합니다),이 페이지의 예제는 틀린가 보지 않습니까? http://en.cppreference.com/w/cpp/regex/regex_iterator –

관련 문제