2009-02-01 33 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实例。