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

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

template<class T>

void container::insert(const T &value)

{

..........

X = value;

..........

}

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

最后一句谁能再详细解释一下,谢谢了!智能指针不能定义为常量类型,是吗?
...全文
324 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
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类为什么不能用智能指针?我现在是有点疑惑。
  • 打赏
  • 举报
回复
原因不是你说的。 是所有权转移的问题,会把数据丢掉。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧