关于 auto_ptr<> 和 auto_ptr_ref<> 的内部实现,我查看了不同的来源。我有这个问题,我不知道为什么。
.... 当从函数返回 'auto_ptr' 时,编译器发现没有合适的 ctor 来复制构造返回的对象。但是有转换为 'auto_ptr_ref' 和 ctor 采用 'auto_ptr_ref' 构造一个 'auto_ptr'。因此,编译器创建一个“auto_ptr_ref”,它基本上只是保存对原始“auto_ptr”的引用,然后从这个对象构造一个“auto_ptr”。就是这样(好吧,当返回一个对象时,编译器通常会经历两次这个过程,因为返回的值被复制到某个地方,但这不会改变这个过程)......(参考http://www.josuttis.com/libbook /auto_ptr.html )
在此示例中,我模拟了 auto_ptr<> 和 auto_ptr_ref<> 的实现,并且能够生成显示编译器确实经历了两次该过程的结果
该示例具有以下基本特征:
1) A 的复制构造函数不采用 const 引用。2) A 具有转换运算符 B 3) A 具有构造函数 A(B);
class B {
};
class A {
public:
A () {
printf("A default constructor() @ %p\r\n", this);
}
A(B) {
printf("constructor(B) @ %p\r\n", this);
}
A (A &a) {
printf("copy constructor(non-const) @ %p\r\n", this);
}
operator B() {
printf("A convertion constructor(B) @ %p\r\n", this);
return B();
}
};
A foo()
{
return A();
}
int main()
{
A a(foo());
}
所以当A a(foo()))被执行时
1) foo() 生成临时对象 X 2) X 转换为类型 B 3) 构造函数 A(B) 用于构造对象a
这是输出:
A default constructor() @ 0xbfea340f
A convertion constructor(B) @ 0xbfea340f
constructor(B) @ 0xbfea344f
A convertion constructor(B) @ 0xbfea344f
constructor(B) @ 0xbfea344e
我们可以看到编译器两次完成了转换构造步骤 2 和 3。
这是为什么?