在回答中将具有 std::auto_ptr 作为其成员变量的类的对象存储在 std::vector 中是否安全?我说过包含 auto_ptr 的类可以存储在向量中假设该类有一个用户定义的复制构造函数.
有一些评论表明情况并非如此,因此这个问题是试图澄清问题。考虑以下代码:
#include <memory>
#include <vector>
using namespace std;
struct Z {};
struct A {
A( Z z )
: p( new Z(z) ) {}
A( const A & a )
: p( a.p.get() ? new Z( *a.p.get()) : 0 ) {}
// no assigment op or dtor defined by intent
auto_ptr <Z> p;
};
int main() {
vector <A> av;
Z z;
A a(z);
av.push_back( a );
av.push_back( A(z) );
av.clear();
}
请检查上述内容并在您的回复中指出未定义的地方
对于以这种特定方式使用的特定类,可能会出现 C++ 标准含义中的行为。我不感兴趣这个类是否有用、行为良好、可排序,或者它在异常情况下的表现如何。
另请注意,这不是关于创建 auto_ptrs 向量的有效性的问题 - 我很清楚与此相关的问题。
感谢大家的意见
回顾过去可能是相当愚蠢的
问题。我想我太专注了
在复印机上并忘记了
任务。我的幸运获奖者
接受分数(分数意味着
奖品!)是litb对于一个典型的
详尽的解释(抱歉
耳柳克)
存储在容器中的对象需要“可复制构造”和“可分配”(C++2008 23.1/3)。
你的类尝试处理 CopyConstructable 要求(尽管我认为它仍然不满足它 - 我编辑了该参数,因为它不是必需的,而且我认为它是有争议的),但它不处理可分配的要求。要可分配 (C++2008 23.1/4),以下条件必须为真:t
是一个值T
and u
是一个值(可能是const
) T
:
t = u
返回一个T&
and t
相当于u
该标准还在注释(20.4.5/3)中说:“auto_ptr
不满足标准库容器元素的可复制构造和可分配要求,因此使用以下实例实例化标准库容器auto_ptr
导致未定义的行为。”
由于您没有声明或定义赋值运算符,因此将提供一个隐式赋值运算符,该运算符使用auto_ptr
的赋值运算符,这肯定使得t
不等于u
,更不用说它根本不起作用“const T u
“ 价值观(这就是厄维克的回答指出 - 我只是指出标准的确切部分)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)