STL容器对元素的要求?越看越糊涂!
请教各位朋友,我在看林越的 高质量C++三版时遇到一个问题一直不能理解,描述如下:
“智能指针式一种模拟原始指针行为的对象,因此理论上也可以作为容器的元素,就像原始指针可以作为容器的元素一样,但是智能指针毕竟是一种特殊的对象,它们在原始指针共享实值对象的基础上普遍增加了自动销毁实值对象的能力,而且其实现方式和种类都非常多,如果不分好坏的都将他们作为容器的元素,可能导致容器之间共享元素对象实值,这不仅不符合STL容器的概念和”值“的语意,而且会存在安全隐患,同时也会存在许多应用上的限制,特别是像STL中的auto_ptr这样的智能指针。”
看了上面的话我疑惑重重,首先,承认2点:
1.原始指针共享实值对象,例如int a=5; int*p=&a; int*q=&a; p和q共享了实值对象a;
2.原始指针可以作为容器的元素。例如vector<int*>vec.vec.push_back(p),vec.push_back(q);p和q指向同一个实值对象a,但是可以把他们放到一个向量里?
上面两点在文中是前提,但是看下面:
"导致容器之间共享元素对象实值,这不仅不符合STL容器的概念和”值“的语意......"
前面明明已经说了,可以将共享实值对象的原始指针作为容器元素,但是这句话又说为了满足“STL容器的概念和”值“的语意”,容器之间不能共享实值。当然也就不能把原始指针放进去了,因为原始指针共享了实值对象。
为什么前后自相矛盾??
到底“STL容器的概念和”值“的语意"是指的什么?
int a=5;
int *p=&a;
int *q=&a;
vector<int*> vec1,vec2;
vec1.push_back(p);
vec2.push_back(p);
容器vec1和容器vec2都包含了p,这是不是不符合”STL容器的概念和”值“的语意”?因为vec1和vec2共享了实值对象a??
迷惑死了~!!!
哪位大虾帮忙解惑,感激不尽!!!!