stringstream 복사가 허용되지 않는 이유는 무엇입니까?
int main()
{
std::stringstream s1("This is my string.");
std::stringstream s2 = s1; // error, copying not allowed
}
stringstream을 복사 할 수없는 이유를 찾을 수 없습니다. 참고 자료를 제공해 주시겠습니까?
복사 생성자를 만들면 C ++의 모든 스트림 복사가 비활성화됩니다 private
.
모든 수단 ANY, 그것은 여부 stringstream
, istream
, ostream
, iostream
또는 무엇 이건.
의미가 없기 때문에 스트림 복사 가 비활성화되었습니다. 스트림이 의미 하는 바를 이해하고 실제로 스트림 복사 가 의미가없는 이유 를 이해하는 것은 매우 중요합니다 . stream
복사 할 수있는 컨테이너가 아닙니다. 데이터가 포함되어 있지 않습니다.
목록 / 벡터 /지도 또는 컨테이너가 버킷 인 경우 스트림은 데이터 가 흐르는 호스 입니다. 일부 파이프와 같은 스트림 생각 을 통해 데이터를 얻을 수있는, 파이프-한쪽에는 소스 (송신자)가 있고 다른쪽에는 싱크 (수신기)가 있습니다. 이를 단방향 스트림이라고합니다. 데이터 가 양방향으로 흐르는 양방향 스트림도 있습니다 . 그렇다면 그러한 것을 복사하는 것이 의미가있는 것은 무엇입니까? 데이터가 전혀 포함되어 있지 않습니다. 그것은이다 통해 어떤 데이터를 얻을.
지금은 가정 동안 스트림의 복사본을 허용하고, 당신이 만든 만드는 경우 사본 의 std::cin
사실 입력 스트림 인을. 복사 된 개체가 copy_cin
. 이제 스스로에게 물어보십시오 : copy_cin
동일한 데이터를 이미 std::cin.
No에서 읽었을 때 스트림 에서 데이터를 읽는 것이 합리적입니까? 사용자가 데이터를 한 번만 입력했기 때문에 키보드 (또는 입력 장치)가 생성 되었기 때문입니다. 전기 신호는 한 번만 전달되고 다른 모든 하드웨어와 저수준 API를 통해 한 번만 흐릅니다. 프로그램이 어떻게 두 번 이상 읽을 수 있습니까?
따라서 사본 생성 은 허용되지 않지만 참조 생성 은 허용됩니다.
std::istream copy_cin = std::cin; //error
std::istream & ref_cin = std::cin; //ok
또한 스트림의 다른 인스턴스를 만들고 이전 스트림이 현재 사용하고 있는 동일한 기본 버퍼 를 사용하도록 만들 수 있습니다 . 이것을보십시오 : https://ideone.com/rijov
질문에 직접 답하려면 stringstream 클래스의 복사 생성자가 private으로 선언 되었기 때문에 복사 할 수 없습니다.
대부분의 경우 스트림을 복사하는 것이 어색해 보이기 때문에 그렇게 선언되었을 것입니다. 따라서 스트림 클래스에는 공용 복사 생성자가 없습니다.
위에서 언급했듯이 스트림을 복사 할 수 없지만 필요한 경우 데이터를 복사 할 수 있습니다.
std::stringstream from;
std::stringstream to;
std::copy(std::istream_iterator<char>(from), std::istream_iterator<char>(),
std::ostream_iterator<char>(to));
참조 URL : https://stackoverflow.com/questions/6010864/why-copying-stringstream-is-not-allowed
'programing' 카테고리의 다른 글
pdflatex를 조용히 실행 (0) | 2021.01.15 |
---|---|
현재 WCF 호출에 대한 데이터를 어디에 저장할까요? (0) | 2021.01.15 |
Mac OSX 터미널에서 별칭 디렉토리로 이동하려면 어떻게해야합니까? (0) | 2021.01.15 |
개발 브랜치에서 git pull origin master를 수행하면 어떻게 되나요? (0) | 2021.01.15 |
Jodatime의 DateTime에 대해 날짜 시간대를 UTC로 기본 설정 (0) | 2021.01.15 |