关于auto_ptr的问题

时间:2009-02-01 17:09:57

标签: c++ templates standard-library

template<class Y>

operator auto_ptr_ref<Y>() throw() {

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

它是标准库中类auto_ptr实现的一部分。

这意味着什么?

为什么“operator”和“()”之间有“auto_ptr_ref”?

2 个答案:

答案 0 :(得分: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),我们将无法从by-value / temporary构造A:那些不能绑定到引用到nonconst:

A(A &a) { 

}

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

auto_ptr和我们的A类使用的技巧仍然可以在temporaries / by-value A上调用非const成员函数。也就是说,我们也可以写:

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

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

但是这样有效,我们当然不想为此烦恼。我们希望它只是分配A()或返回A by-value的函数的返回值。那么auto_ptr和我们的A类使用的是转换运算符,它自动计算出当A转换为B时,我们可以使用我们临时创建的B构造一个A实例。

答案 1 :(得分:2)

这是转换操作符,从auto_ptr转换为auto_ptr_ref&lt; Y&gt;。