gpt4 book ai didi

c++ - 引用包含对象引用的 STL vector 会在 C++ 中生成错误。为什么?

转载 作者:太空狗 更新时间:2023-10-29 21:02:31 28 4
gpt4 key购买 nike

为什么我不能引用包含对象引用的 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

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

最佳答案

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

表 27 见§17.6.3.5 分配器要求:

enter image description here

另一种方法是使用 std::reference_wrapperpush_back 元素的 vector :

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

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

此外,我建议不要调用您的 vector list - 有一个 std::list 容器类型。它是什么列表? 香蕉?

关于c++ - 引用包含对象引用的 STL vector 会在 C++ 中生成错误。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15178458/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com