2009-02-01 3 views
2
template<class Y> 

operator auto_ptr_ref<Y>() throw() { 

    return auto_ptr_ref<Y>(release()); 
} 

표준 라이브러리에서 auto_ptr 클래스 구현의 일부입니다.auto_ptr에 대한 질문입니다

이것은 무엇을 의미합니까?

"연산자"와 "()"사이에 "auto_ptr_ref"가있는 이유는 무엇입니까?

답변

2

auto_ptr에서 auto_ptr_ref로 캐스팅하는 변환 연산자입니다. <Y>.

+0

캐스트 연산자는 변환 연산자와 동의어입니다. –

+1

@Dean Michael : 감사합니다. C'isms를 깨뜨리기가 어렵습니다. – user7116

4

왜 변환 연산자가 해당에 발생하는지 알려 드리겠습니다. 음,이 예를 살펴 :

struct A; 
struct B { 
    explicit B(A&a):a(a){ } 
    A &a; 
}; 

struct A { 
    A() { } 
    A(B b){ move_from(a); } 
    A(A &a) { move_from(a); } 

    operator B() { return B(*this); } 

    void move_from(A &a) { 
     std::cout << "A::A(@" << &b.a << ")" << std::endl; 
    } 
}; 

int main() { 
    A a = A(); 
} 

우리는 우리의 클래스 A에 대한 이동의 의미를 가지고 자사의 복사 생성자에서, 우리는 다른 인스턴스에서 멀리 몇 가지 물건을 "훔쳐"할. auto_ptr의 경우, 그것은 관리되는 포인터입니다. 대신 우리는 단지 메시지를 출력합니다. '사람들은 할 수

A(A const& a) { 
    /* oops, a is const, we can't steal something from it! */ 
} 

우리가 A(A &a)에, 우리는에 의해 값/일시 A로부터 구성 할 수 없음을 변경한다면 : 중요한 것은 우리가 보통의 복사 생성자를 사용할 수 있다는 것입니다 t는 참조 - 투 - nonconst에 바인딩 :

A(A &a) { 

} 

... 
A a = A(); // fail, because A &a = A() doesn't work 

auto_ptr은 우리의 클래스는 A의 값으로/정지 임시직에 호출 할 수있는 멤버 함수를 nonconst 트릭을 사용합니다. 즉 우리는 또한 작성한 수 있습니다 :

struct A { 
    ... 
    B get_b() { return B(*this); } 
    ... 
}; 

... 
A a = A().get_b(); 

을하지만 그 작품, 우리는 물론, 그 신경 쓰고 싶지 않다. A() 또는 A by-value를 반환하는 함수의 반환 값을 할당하면됩니다. 따라서 auto_ptr과 A 클래스가 사용하는 변환 연산자는 A가 B로 변환 될 때 우리가 임시로 만든 B를 사용하여 A 인스턴스를 생성 할 수 있다는 것을 자동으로 계산합니다.

관련 문제