为什么在C ++中的容器中存储引用(而不是指针)不起作用?

时间:2010-10-24 23:05:13

标签: c++ stl reference containers

在我的程序中,我有一个STL集。

set<string> myStrings;

为了提高代码的效率,我把它改为hold,只有指针。 (我不需要存储实际的字符串副本。)

set<string*> myStrings;

我已经读过,在可能的情况下用指针替换指针是一个好习惯。 (当然,仅当不需要指针的实际功能时。)

set<string&> myStrings;

但后者给了我很多编译器错误。 为什么不能将引用用作容器元素?

3 个答案:

答案 0 :(得分:45)

容器存储对象。引用不是对象。

C ++ 11规范明确指出(§23.2.1[container.requirements.general] / 1):

  

容器是存储其他对象的对象。

答案 1 :(得分:11)

与“为什么”没有直接关系,但为了回答这样做的隐含愿望,我要提到c ++ 11标准库有std::reference_wrapper来启用它。它可以隐式转换为引用,并且可以存储在标准容器中。

答案 2 :(得分:2)

由于容器存储对象和引用不是对象。如果你是在c ++ 11,你可以使用std :: reference_wrapper将事物包装到可分配的对象。

http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

std :: reference_wrapper是一个类模板,它在可复制的可分配对象中包装引用。它经常被用作在标准容器(如std :: vector)中存储引用的机制,它通常不能保存引用。