答案
不能
原因
#include <vector>
#include <boost/shared_ptr.hpp>
using namespace std;
class test {};
typedef boost::shared_ptr<test> test_ptr;
int main()
{
vector<test> tmp;
vector<test*> tmp1; //小心内存泄露,重复析构等问题
//vector<test&> tmp; //直接编译通不过
vector<test_ptr> tmp2;
//vector<test_ptr&> tmp3; //即使是boost的智能指针的引用也不行
return 0;
}
c++ 的 STL 中主要有 vector , list, map, set , multimap,multiset ,这些容器都要求元素类型满足以下2种情况:
- 能被复制:
- 将数据放入容器的过程就是通过数据的复制构造函数在容器内创建数据的一个副本的过程。这要求容器使用的元素类型可以被复制
- 也就是说类类型需要复制构造函数的支持
- 能被赋值:
- 在使用容器的删除、查找、访问、使用迭代器修改元素等许多情况下,都需要元素的赋值操作支持,
- 也就是说类类型需要赋值操作符运算的支持。
vector、list 中的单参数的resize 操作需要默认初始化指定个数的元素,类类型需要无参数的默认构造函数支持初始化。
set、multiset, map和multimap中的键类型、 list 中的sort 操作 都需要 < 比较操作来排序,类类型需要 < 操作符运算的支持。
在STL中,容器的元素要满足三个基本要求:可拷贝(copyable)、可赋值(assignable)、可析构(destroyable)。基本数据类型和自定义的类都满足这些条件,但是引用不满足,因为引用不能析构。