2016-06-27 2 views
1

이 제안 n4228 읽기 나는 다음과 같은 코드를 읽어 보시기 바랍니다 .정제 식 평가 (제안 n4228의 C++ 17)

어디에 문제가 있습니까? 어쩌면 s.find("even")s.find(" don't")은 다른 측면과 다른 순서로 평가됩니까? 어떤 replaces가 발생하기 전에?

문제를 발견하는 도구는 누구입니까?

+0

힌트 : 첫 번째 검색에서 '짝수'의 첫 번째 문자 또는 그 뒤에 오는 문자로 반복자를 반환합니까? – lorro

+2

* "s.find ("even ") 및 s.find ("do not ")는 다른 사람이 기대하는 것과 다른 순서로 평가 될 수 있습니다. 빙고. 그것들은 어떤 순서로 평가 될 수 있습니다. 그래서 평가의 순서가 중요하다면. 직접 시퀀스하십시오. – StoryTeller

답변

1

네, 맞습니다. C++ (pre-17)의 규칙에 따라 s.find에 대한 두 번의 호출은 대체 호출 전에 실행될 수 있습니다. 그리고 바꾸기 호출이 문자열을 수정하기 때문에 find에 의해 반환 된 인덱스가 사용되는 시점까지 더 이상 유효하지 않게 만들 수 있습니다.

C++ 17 CD에 투표 된 (불행히도 약한) 규칙이이를 방지하고 코드가 예상대로 작동합니다.