我想编写一个带有构造函数的 C++ 类,该构造函数将 aauto_ptr
作为其参数,以便我可以将类实例从auto_ptr
s 初始化为另一个实例:
#include <memory>
class A
{
public:
A() {}
A(std::auto_ptr<A> other) {}
};
std::auto_ptr<A> create()
{
return std::auto_ptr<A>(new A());
}
void foo()
{
A x = create();
// A y ( create() ); // works
}
在 gcc 4.6 上编译此代码g++ -c test.cpp
会产生以下错误消息:
test.cpp: In function ‘void foo()’:
test.cpp:17:16: error: no matching function for call to ‘std::auto_ptr<A>::auto_ptr(std::auto_ptr<A>)’
test.cpp:17:16: note: candidates are:
/usr/include/c++/4.6/backward/auto_ptr.h:260:7: note: std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr_ref<_Tp>) [with _Tp = A]
/usr/include/c++/4.6/backward/auto_ptr.h:260:7: note: no known conversion for argument 1 from ‘std::auto_ptr<A>’ to ‘std::auto_ptr_ref<A>’
/usr/include/c++/4.6/backward/auto_ptr.h:125:9: note: std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr<_Tp1>&) [with _Tp1 = A, _Tp = A]
/usr/include/c++/4.6/backward/auto_ptr.h:125:9: note: no known conversion for argument 1 from ‘std::auto_ptr<A>’ to ‘std::auto_ptr<A>&’
/usr/include/c++/4.6/backward/auto_ptr.h:112:7: note: std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr<_Tp>&) [with _Tp = A, std::auto_ptr<_Tp> = std::auto_ptr<A>]
/usr/include/c++/4.6/backward/auto_ptr.h:112:7: note: no known conversion for argument 1 from ‘std::auto_ptr<A>’ to ‘std::auto_ptr<A>&’
test.cpp:7:3: error: initializing argument 1 of ‘A::A(std::auto_ptr<A>)’
但是,如果我使用语法A y (create());
来创建我的对象,它就可以工作。
我想知道为什么会发生这种情况,以及我是否可以做些什么来解决它。
编辑:我还要指出,如果我将构造函数签名更改为
A(const std::auto_ptr<A>& other) {}
那么一切都很好,但是这并不具有所有权,auto_ptr
因此没有我想要的语义。
编辑2:如果我对赋值运算符做同样的事情,即
A& operator=( std::auto_ptr<A> other) {}
那我可以
A x;
x = create();
为什么?