2012-11-28 2 views
1

auto_ptr을 사용하여 효과적으로 an article을 읽었습니다. - 실수로 오용을 방지하기auto_ptr에 원시 포인터 할당

// Example 10(c): Correct (finally!) 
// 
auto_ptr<String> f() 
{ 
    auto_ptr<String> result = new String; 
    *result = "some value"; 
    cout << "some output"; 
    return result; // rely on transfer of ownership; 
        // this can't throw 
} 

그러나이 내가 아는 한, auto_ptr의 할당 연산자 만 rhs 같은 다른 auto_ptr 허용합니다 거기에, 다음 코드는 코드의 올바른 조각으로 제안했다. 그래서, 다음 라인은 기사의 오타가 되었습니까? 아니면 정말 일하기로되어 있습니까?

auto_ptr<String> result = new String; 

답변

5

그 라인은 실제로 틀렸지 만, 생각하는 이유 때문이 아닙니다. 그것은 대입 연산자를 호출하지 않고 대신 생성자를 호출합니다. = 때 첫 번째 개체를 선언 할 때 개체를 만들고 할당 연산자를 호출하지 않습니다. 오히려 그것은 단지 생성자를 호출하고이를 인수로 전달합니다. 그래서이 관점에서 볼 때 생성자를 사용하고 할당 연산자를 사용하지 않기 때문에 "올바른"것입니다.

아니면 적어도 그렇게 할 수 있습니다. std::auto_ptr의 생성자가 포인터를 사용한다는 것을 알 수 있습니다. 그러나 explicit으로 표시되어 위의 "바로 가기"는 허용되지 않습니다. 명시 적으로 생성자 (괄호 포함)를 호출해야하며 단축키로 =을 사용할 수 없습니다. 이것이 잘못된 이유입니다. 대신, 그들이 auto_ptr<String> result(new String);라고 말하면, 모두 괜찮을 것입니다. 또한 생성자가 explicit으로 표시되지 않은 경우 모두 괜찮습니다. 그러나 그대로, 그것은 정확하지 않습니다.

+0

당신이 맞습니다, +1. – jogojapan

+0

하지만 치유 사의 (지금 삭제 된) 답변에 대한 귀하의 의견과 관련하여 : 물론 이것은 복사 생성자와 관련이 있습니다. 질문에 언급 된 초기화가 작동하지 않는 이유에 대한 귀하의 대답이 옳습니다. 그러나 이것이 복사 생성자와 관련된 복사 초기화라는 것이 또한 정확합니다. (복사 생성자에 대한 실제 호출은 멀리 떨어져 있지만, 다른 문제 일 수 있습니다.) – jogojapan

+0

@jogojapan : 음, 매일 새로운 것을 배웁니다. 컴파일러가 호출 될 때 (컴파일러에서 멀리 떨어진 곳으로 최적화하기 전에) 더 많은 것을 설명 할 때 정확히 내가 어딘가에서 (표준보다 덜 합법적 인) 읽을 수 있습니까? – Cornstalks