gpt4 book ai didi

c++ - 包含存储在 vector 中的 auto_ptr 的类

转载 作者:太空狗 更新时间:2023-10-29 19:55:50 25 4
gpt4 key购买 nike

在对 Is it safe to store objects of a class which has an std::auto_ptr as its member variable in std::vector? 的回答中我说过包含 auto_ptr 的类可以存储在 vector 中前提是该类具有用户定义的复制构造函数

有几条评论表明情况并非如此,所以这个问题是为了澄清问题。考虑以下代码:

#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 vector 的有效性的问题 - 我很清楚与此相关的问题。

Thanks all for your inputs on what in retrospect is probably a rather silly question. I guess I focussed too much on the copy ctor & forgot about assignment. The lucky winner of my acceptance points (and points mean prizes!) is litb for a typically exhaustive explanation (sorry earwicker)

最佳答案

存储在容器中的对象必须是“CopyConstructable”和“Assignable”(C++2008 23.1/3)。

你的类(class)试图处理 CopyConstructable 要求(虽然我认为它仍然不满足它 - 我编辑了那个参数因为它不是必需的并且因为我认为它是有争议的),但它不处理可分配要求。要可分配 (C++2008 23.1/4),以下必须为真,其中 tT 的值,u 是一个(可能是 const)T 的值:

t = u returns a T& and t is equivalent to u

该标准还在注释 (20.4.5/3) 中指出:“auto_ptr 不满足标准库容器元素的 CopyConstructible 和 Assignable 要求,因此用 auto_ptr 导致未定义的行为。”

由于您没有声明或定义赋值运算符,因此将提供一个使用 auto_ptr 的赋值运算符的隐式运算符,这肯定使 t 不等价u,更不用说它对“const T u”值根本不起作用(这就是 Earwicker's answer 指出的 - 我只是指出出标准的确切部分)。

关于c++ - 包含存储在 vector 中的 auto_ptr 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/704780/

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