gpt4 book ai didi

c++ - 采用 auto_ptr 的构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:20:50 28 4
gpt4 key购买 nike

我想编写一个带有构造函数的 C++ 类,该构造函数将 auto_ptr 作为其参数,以便我可以将类实例从 auto_ptr 初始化为另一个实例:

#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();

为什么?

最佳答案

您只允许一个 隐式的、用户定义的转换。从另一个构造一个 auto_ptr 已经涉及到通过辅助 auto_ptr_ref 类的隐式转换,所以你不能从一个 auto_ptr 隐式构造你自己的类.

通过使用直接初始化,其中一个转换是显式,只剩下一个隐式的用户定义转换,这很好。

要“解决”缺少隐式转换的问题,您可以修改构造函数以通过(非常量)引用获取 auto_ptr,或者将所有内容迁移到 unique_ptrs.

关于c++ - 采用 auto_ptr 的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19643079/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com