C++ 컴파일러의 어이없는 분석결과를 조심하자

ifstream dataFile(“ints.dat”);
list<int> data(istream_iterator<int>(dataFile),
istream_iterator<int>() );

위의 코드는 범위생성자를 사용해서 “ints.dat” 파일의 정수값을 읽어 list에 넣는다는 의미이다. 컴파일이 되기는 하지만 정상적으로 작동하지는 않을 것이다.
자세한 이유는 생략한다.
위의 코드가 정상적으로 작동하지 않는 이유는
class Widget{…};    // 기본생성자가 있다고 가정한다.
Widget w(); // 아무것도 받아들이지 않는고
// Widget을 반환하는 함수 w를 선언한다.

이것과 유사한 이유이다. 어쨋거나 위의 코드같은 문제가 일어나지 않기를 바란다면 익명객체선언을 istream_iterator에 쓰지말고 각 반복자를 변수로 할당하는 것이다.
ifstream dataFile(“ints.dat”);
istream_iterator<int> dataBegin(dataFile);
istream_iterator<int> dataEnd;
list<int> data(dataBegin, dataEnd);

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다