스트링스트림을 사용하는 이유 >> C 11 이후 추출 실패 시 대상 값을 변경하시겠습니까?
Stroustrup의 "TC PL"에는 istream 또는 ostream 작업이 실패하는 경우 대상 변수의 값이 변경되지 않은 상태로 유지되어야 한다고 명시되어 있습니다. 그러나 이는 stringstream:
#include <iostream> #include <sstream> int main() { std::stringstream ss; int v = 123; ss << "The quick brown fox."; if (ss >> v) { std::cout << "Unexpected success in reading a word into an int!\n"; } std::cout << "After extraction failure: " << v << "\n"; return 1; }
이 코드는 Stroustrup의 주장에도 불구하고 "추출 실패 후: 0"을 인쇄합니다.
C 11 동작 수정
이 모순은 C 11 이후 스트링스트림 동작의 변화에서 비롯됩니다. C 이전 11에서 stringstream은 scanf 스타일 구문 분석 방법을 사용하여 실패 시 목표 값을 변경하지 않고 그대로 두었습니다. 그러나 C 11부터는 value 변수에 0을 쓰고 추출 실패 시 실패 비트를 설정하는 std::strtoll을 사용합니다.
이 변경 사항은 istream 및 ostream 작업의 수정된 C 11 동작에 맞춰 조정됩니다.
결론
Stroustrup의 인용문은 istream 및 ostream 작업의 동작을 정확하게 설명합니다. C 11 이전에 stringstream의 C 11 이후 동작은 다음의 채택으로 인해 이 설명에서 벗어났습니다. 추출 메커니즘이 다릅니다. C 11 이상에서는 문자열 스트림 작업을 사용할 때 이러한 변경된 동작을 인식하는 것이 중요합니다.
위 내용은 C 11 이상에서 추출 실패 시 'stringstream'이 대상 변수를 수정하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!