谁能解析一下这个语法问题

qynum123 2013-02-06 03:31:47
4. 智能指针不能作为容器类的元素。例如:

template<class T>

void container::insert(const T &value)

{

..........

X = value;

..........

}

事实上在stl中,所有的container要内部拷贝所传参数的值时都是传的const类型的值。因此无法用auto_ptr传进去。

最后一句谁能再详细解释一下,谢谢了!智能指针不能定义为常量类型,是吗?
...全文
296 9 点赞 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qynum123 2013-02-06
引用 7 楼 rocktyt2 的回复:
我错了 看了下auto_ptr的源码,auto_ptr没有提供auto_ptr(const auto_ptr&)形式的拷贝构造,只有auto_ptr(auto_ptr&)形式的 所以X = value;的时候因为右操作数是const,无法通过编译,如顶楼描述的那样
kldn, 嗯,做了个测试: class A { public: explicit A(int a = 0):_a(a) {} ~A() {} A(const A &rhs) //去掉常量,则编译报错 { _a = rhs._a; } private: int _a; }; main() { vector<A> vecA; A a(1); vecA.push_back(a); system("pause"); } 结贴了。好象VC6的auto_ptr可以,但未证实,有兴趣的朋友可以自己查看一下。即使可以编译通过,也会有rocktyt2所说的那些问题,值得关注!
  • 打赏
  • 举报
回复
chanhit 2013-02-06
一般用 boost::shared_ptr或boost::scoped_ptr很少用auto_ptr
  • 打赏
  • 举报
回复
rocktyt 2013-02-06
我错了 看了下auto_ptr的源码,auto_ptr没有提供auto_ptr(const auto_ptr&)形式的拷贝构造,只有auto_ptr(auto_ptr&)形式的 所以X = value;的时候因为右操作数是const,无法通过编译,如顶楼描述的那样
  • 打赏
  • 举报
回复
qynum123 2013-02-06
vector<auto_ptr<int>> vec; auto_ptr<int> p(new int(14)); vec.push_back(p); 这样编译会出错,error C2558: class 'std::auto_ptr<_Ty>' : no copy constructor available or copy constructor is declared 'explicit'
  • 打赏
  • 举报
回复
rocktyt 2013-02-06
引用 4 楼 qynum123 的回复:
引用 3 楼 rocktyt2 的回复:auto_ptr在赋值、拷贝构造的时候,内部管理的资源的所有权会被转移 auto_ptr<string> pa = new string(); auto_ptr<string> pb = pa;//pa指向NULL,pb获取资源 pa = pb;//pb指向NULL,pa获取资源 stl容器要求内部元素要能满足拷贝语义,……
与是否常量无关 就算你把auto_ptr真的放进stl容器里,编译也不会出错的,只不过运行时会群魔乱舞而已,各种内存泄露,非法访问都会跑出来
  • 打赏
  • 举报
回复
qynum123 2013-02-06
引用 3 楼 rocktyt2 的回复:
auto_ptr在赋值、拷贝构造的时候,内部管理的资源的所有权会被转移 auto_ptr<string> pa = new string(); auto_ptr<string> pb = pa;//pa指向NULL,pb获取资源 pa = pb;//pb指向NULL,pa获取资源 stl容器要求内部元素要能满足拷贝语义,因为stl很多算法都会对元素进行拷贝,a……
是因为容器类要拷贝传进来参数的值 ,智能指针在传进来后,进行拷贝时会译放掉自己所拥有的指针,但传进来的参数是常量不允许修改原数据,故会出错,是吗?我测试一下。
  • 打赏
  • 举报
回复
rocktyt 2013-02-06
auto_ptr在赋值、拷贝构造的时候,内部管理的资源的所有权会被转移 auto_ptr<string> pa = new string(); auto_ptr<string> pb = pa;//pa指向NULL,pb获取资源 pa = pb;//pb指向NULL,pa获取资源 stl容器要求内部元素要能满足拷贝语义,因为stl很多算法都会对元素进行拷贝,auto_ptr的拷贝操作与一般意义上的拷贝的含义不同
  • 打赏
  • 举报
回复
qynum123 2013-02-06
引用 1 楼 akirya 的回复:
原因不是你说的。 是所有权转移的问题,会把数据丢掉。
能否详细说明一下,Container类为什么不能用智能指针?我现在是有点疑惑。
  • 打赏
  • 举报
回复
原因不是你说的。 是所有权转移的问题,会把数据丢掉。
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2013-02-06 03:31
社区公告
暂无公告