3

为什么我不能引用包含对象引用的 std::vector?以下代码在 Visual C++ 2010 中生成编译错误:

void Map::Filter( Object::Type type, std::vector<Object&>& list )
{
  for ( register int y = 0; y < MAP_H; y++ )
    for ( register int x = 0; x < MAP_W; x++ ) {
      if ( under[y][x].GetType() == type )
        list.push_back(under[y][x]);
      if ( above[y][x].GetType() == type )
        list.push_back(above[y][x]);
    }
}

总结编译错误:

c:\program files\microsoft visual studio 10.0\vc\include\xmemory(137): error C2528: 'pointer' : pointer to reference is illegal
c:\program files\microsoft visual studio 10.0\vc\include\vector(421) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled

我通过从“对象引用向量”切换到“对象指针向量”解决了这个问题。我只是不明白为什么我不能引用引用向量。

4

1 回答 1

4

标准容器使用分配器来分配内存以及构造和销毁元素。X分配器要求是为负责分配类型对象的分配器类指定的T。该类型T被指定为“任何非常量、非引用对象类型”(表 27)。因此,对引用对象的分配器没有任何要求。这意味着尝试创建引用类型的容器将直接导致未定义的行为。

表 27 可在 §17.6.3.5 分配器要求中找到:

在此处输入图像描述

另一种方法是使用一个向量std::reference_wrapperpush_back你的元素:

list.push_back(std::ref(under[y][x]));

另一种选择是使用原始指针,或者可能使用World's Dumbest Smart Pointer的实现。

另外,我建议不要调用你的向量list- 有一个std::list容器类型。它的清单是什么?cats? people? bananas?

于 2013-03-02T19:56:47.427 回答