> 백엔드 개발 > C++ > C 11 이상에서 추출 실패 시 'stringstream'이 대상 변수를 수정하는 이유는 무엇입니까?

C 11 이상에서 추출 실패 시 'stringstream'이 대상 변수를 수정하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-26 15:46:09
원래의
524명이 탐색했습니다.

Why Does `stringstream` Modify the Target Variable on Extraction Failure in C  11 and Later?

스트링스트림을 사용하는 이유 >> 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 동작에 맞춰 조정됩니다.

  • 실패 시 목표값은 0 또는 적절한 극단으로 설정됩니다. value.
  • failbit은 실패를 나타내도록 설정됩니다.

결론

Stroustrup의 인용문은 istream 및 ostream 작업의 동작을 정확하게 설명합니다. C 11 이전에 stringstream의 C 11 이후 동작은 다음의 채택으로 인해 이 설명에서 벗어났습니다. 추출 메커니즘이 다릅니다. C 11 이상에서는 문자열 스트림 작업을 사용할 때 이러한 변경된 동작을 인식하는 것이 중요합니다.

위 내용은 C 11 이상에서 추출 실패 시 'stringstream'이 대상 변수를 수정하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿