[해결] C++ COAP(Container of AutoPtr) 금지가 어디까지 적용되나요?
글쓴이: winner / 작성시간: 목, 2007/07/05 - 8:35오후
후배가 C++ 로 간만에 programming 하는 것을 보다가 제가 COAP 이라고 안 된다고 태클을 걸었는데요.
생각을 해보면 과연 문제가 될만한 사항인지 궁금하더군요.
Effective STL 등 COAP 에 대해서 이야기하는 책들을 보면 COAP 에다가 수정 algorithm 을 적용시키는 예를 보여줍니다.
대표적으로 sort 를 써서 말이죠.
그런데 많은 algorithm 은 무수정이고, 후배의 source 를 태클걸었을 때 그 source 는 아직 algorithm 을 적용시키지 않았었습니다.
그것도 후배는 수정되지 않는 연관 container 에 원소를 담았죠.
좀더 정확히 이야기해서 map 에 auto_ptr 을 넣었습니다.
pair 의 second 원소의 type 에 auto_ptr 을 넣은 겁니다.
저는 COAP 은 금지다라고만 책에서 읽었지 자세한 사항은 모릅니다.
저의 태클은 정당하지 않은 것 같더군요.
추가적으로 하나더 질문이 있는데요.
C++ 의 함수를 요구하는 부분에 template 을 넣으면 type 유추가 안 되나요?
for_each 의 마지막 인자에 template 을 구체화시키지 않고 그냥 넣었거든요.
반복자인 첫번째와 두번째 인자에 의해서 마지막 함수 template 도 구체화 될 거라고 생각했는데 안되더군요.
명시적으로 구체화시키니 됩니다.
이부분에 대한 정확한 설명이 가능했으면 좋겠네요.
수정/비수정
수정/비수정 algorithm을 따지기 이전에 STL 컨테이너에 auto_ptr을 저장할 수 없습니다.
그 코드는 컴파일 에러가 나는 것이 정상이고, 컴파일러가 후져서 억지로 컴파일을 했다 하더라도 런타임 에러가 날 것입니다.
따라서 님의 태클은 정당합니다.
추가질문에 대해서...
그것은 문법적으로 잘못된 것입니다. for_each도 템플릿이므로 인자를 보고 type을 유추합니다.
그런데 템플릿 자체는 type이 될 수 없고 그것을 구체화한 것이 type이 되는 것입니다.
예를 들면 vector는 템플릿, vector는 type입니다.
이건 사족이지만 만약 님이 의도하는 대로 세번째 인자에 템플릿을 쓸 수 있다고 가정해 봅시다.
그것을 컴파일러가 실체화하려면 앞의 두 개의 iterator와 세번째 인자가 어떤 관련을 갖고 있는지 파악해야 하는데
그것은 for_each의 함수 정의를 보고 의미/의도를 분석한 후에야 가능합니다.
얼마나 복잡할지 상상이 가시죠? 현재의 기술로는 불가능합니다.
음... 그 COAP 에 대해 좀더 정확한 해석이 구합니다.
제 추측으로는 할당기 때문에 COAP 이 원천적으로 금지되는 것이 아닌가 합니다.
비록 원소를 수정할 수 없는 연관 container 라 할 지라도 내부적으로 동작하는 할당기에 의해
원소가 복사한 후 작업을 진행할 수 있기 때문이 아닐까 하는데요.
for_each 에 대해서는 어느정도 이해가 갑니다.
그나저나 template 은 언제나 규칙이 너무 복잡해요.
auto_ptr의
auto_ptr의 복사생성자와 operator=()을 보면 다음과 같습니다.
인자 a의 형이 non-const임을 유의하십시오.
그런데 컨테이너에 원소를 삽입하는 작업은 모두 원본이 const입니다.
몇 가지 예를 들면
이들 내부에서 복사를 하게 되는데 이때 원본이 const인 auto_ptr의 복사가
불가능하기 때문에 auto_ptr은 컨테이너에 담을 수 없는 것입니다.
다른 말로 표현하면 auto_ptr은 컨테이너의 요구조건인 copy-constuctible을
만족하지 않습니다.
단순한 이유였군요.
실은 auto_ptr 을 써본 적이 없었는데 compile 한번만 해봐도 알만한 거였군요.
Compile 안 되는게 당연한네요.
댓글 달기