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

operator auto_ptr_ref<Y>() throw() { 

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

它是標準庫中auto_ptr類的實現的一部分。關於auto_ptr的問題

這意味着什麼?

爲什麼在「operator」和「()」之間有「auto_ptr_ref」?

回答

2

這是操作中的轉換運算符,從auto_ptr投射到auto_ptr_ref <是>。

+0

演員演員是轉換演員的代名詞。 – 2009-02-01 17:19:01

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),我們將無法從按值/一個臨時構造:那些能夠」噸被綁定到一個參考到非const:

A(A &a) { 

} 

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

auto_ptr的和我們的A類使用非const成員函數特技仍然可以在臨時變量名爲/由值A的。也就是說,我們也可以這樣寫:

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

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

但是,這樣做有效,當然,我們不希望被這些困擾。我們希望它只是用於分配一個A()或函數返回值的返回值A的值。所以auto_ptr和我們的A類所使用的是一個轉換運算符,它自動地指出當A被轉換爲B時,我們可以使用我們暫時創建的B構造一個A實例。