[해결] C++ COAP(Container of AutoPtr) 금지가 어디까지 적용되나요?

winner의 이미지

후배가 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의 함수 정의를 보고 의미/의도를 분석한 후에야 가능합니다.
얼마나 복잡할지 상상이 가시죠? 현재의 기술로는 불가능합니다.

winner의 이미지

제 추측으로는 할당기 때문에 COAP 이 원천적으로 금지되는 것이 아닌가 합니다.
비록 원소를 수정할 수 없는 연관 container 라 할 지라도 내부적으로 동작하는 할당기에 의해
원소가 복사한 후 작업을 진행할 수 있기 때문이 아닐까 하는데요.

for_each 에 대해서는 어느정도 이해가 갑니다.

그나저나 template 은 언제나 규칙이 너무 복잡해요.

익명 사용자의 이미지

auto_ptr의 복사생성자와 operator=()을 보면 다음과 같습니다.

auto_ptr(auto_ptr& a);
auto_ptr& operator=(auto_ptr& a);

인자 a의 형이 non-const임을 유의하십시오.
그런데 컨테이너에 원소를 삽입하는 작업은 모두 원본이 const입니다.
몇 가지 예를 들면
void vector::push_back(const T&);
iterator vector::insert(iterator position, const T& x);
void stack::push(const value_type& x);
T& map::operator[](const key_type& x);
pair<iterator, bool> set::insert(const value_type& x);

이들 내부에서 복사를 하게 되는데 이때 원본이 const인 auto_ptr의 복사가
불가능하기 때문에 auto_ptr은 컨테이너에 담을 수 없는 것입니다.
다른 말로 표현하면 auto_ptr은 컨테이너의 요구조건인 copy-constuctible을
만족하지 않습니다.
winner의 이미지

실은 auto_ptr 을 써본 적이 없었는데 compile 한번만 해봐도 알만한 거였군요.
Compile 안 되는게 당연한네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.