为什么我不能使用引用类型作为容器类型的值类型?

Tho*_*son 7 c++ stl

例如,std::vector<int&> vec_int;这似乎在c ++中无效.为什么这个无效?

ypn*_*nos 9

STL容器需要能够使用默认构造函数构造对象.你不能用引用来做到这一点.保证引用有效,因此必须始终使用赋值进行初始化.

您需要使用指针.

  • 还有另一个原因.无法分配参考.我相信`:: std :: vector`要求存储在其中的东西是可分配的. (5认同)
  • 这里有两个注释.也可以使用`boost :: ref`来存储容器中的引用.关于指针,还有`boost :: shared_ptr`来安全地存储它们.内存分配. (3认同)
  • 可转让性可能是这里的罪魁祸首.AFAIK,容器不需要默认构造函数,除非你调用使用它的方法(例如``resize()`with default和similar). (2认同)

Die*_*lla 3

按照上面的 chryspi 请求回答。正如其他回复中所评论的,您不能直接使用引用,因为引用本身并不存在。

但是,您可以使用引用,但要使用boost::reference_wrapper<T>实用程序类:

    typedef boost::reference_wrapper<int> intref;
    std::vector<intref> v;
    int i;
    i = 9;

    v.push_back (boost::ref (i));  // store &i

    int& j = v[0];
    j = 10;
    //v[0].get() = 10;

    std::cout << i << std::endl; // prints 10
Run Code Online (Sandbox Code Playgroud)

我以如何直接修改元素为例v[0]。请注意,这有点棘手(您必须调用该get()方法),因为您得到的是 aboost::reference_wrapper<T>而不是实际的引用。

为了相对于内存安全地存储指针,您可以使用boost::shared_ptr类似的方法。