template<class Y>
operator auto_ptr_ref<Y>() throw() {
return auto_ptr_ref<Y>(release());
}
它是标准库中auto_ptr类的实现的一部分。关于auto_ptr的问题
这意味着什么?
为什么在“operator”和“()”之间有“auto_ptr_ref”?
template<class Y>
operator auto_ptr_ref<Y>() throw() {
return auto_ptr_ref<Y>(release());
}
它是标准库中auto_ptr类的实现的一部分。关于auto_ptr的问题
这意味着什么?
为什么在“operator”和“()”之间有“auto_ptr_ref”?
这是操作中的转换运算符,从auto_ptr投射到auto_ptr_ref <是>。
我会告诉你为什么转换操作符恰好在那里。那么,看看下面这个例子:
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实例。
演员演员是转换演员的代名词。 – 2009-02-01 17:19:01