当需要特定类型的向量时,通过引用传递 void 指针的向量
Passing vector of void pointers by reference when a vector of specific type is expected
请考虑以下场景:
class A
{
public:
int a;
A(int _a) : a(_a) {}
};
void Get(std::vector<A*>& vec)
{
A* a1 = new A(5);
A* a2 = new A(50);
A* a3 = new A(500);
vec.push_back(a1);
vec.push_back(a2);
vec.push_back(a3);
}
int main()
{
// Scenario 1
auto vec = std::vector<A*>();
Get(vec);
for(auto* v : vec)
std::cout << v->a << std::endl;
// Scenario 2:
auto vecvoid = std::vector<void*>();
vecvoid.assign(vec.begin(), vec.end());
for(auto* v : vecvoid)
std::cout << static_cast<A*>(v)->a << std::endl;
return 0;
}
在场景 2 中,是否可以将vecvoid
直接传递给Get()
(不重载/修改Get()
(,而不是使用如上所示的两步方法(函数调用后跟调用 vector::assign()
(?
幸运的是,这是不可能的。
std::vector<A*>
和std::vector<void*>
是不相关的类型。
考虑一下如果可能会发生什么:
void G(std::vector<A*>& vec)
{
*vec[0] = A(7);
}
// ...
int x = 0;
std::vector<void*> v = { &x };
G(v); // Oops.
它可能适用于具有reinterpret_cast
的常见编译器,但它显然调用了未定义的行为,因为它不是reinterpret_cast
的有效使用:
Get(reinterpret_cast<std::vector<A*>&>(vecvoid));
我刚刚用CLang 3.4对其进行了测试,它甚至没有警告就给出了预期的结果。这并不奇怪,因为无论指针的类型如何,为将指针推送到向量中而生成的汇编代码都是相同的。但是您必须控制生成的程序集以确保...
TL/DR:请不要那样做!它根本不是C++代码,因为正如您在其他答案中被告知的那样,vector<void *>
和vector<A *>
是完全不同的类型。
在场景 2 中,是否可以将 vecvoid 直接传递给 Get(([?
不,不是。
虽然A*
可以转换为void*
,但std::vector<A*>
与std::vector<void*>
完全不同。另一种选择是:
struct A {};
A a1, a2;
auto veca = std::vector<A*>{&a1, &a2};
auto vecvoid = std::vector<void*>{begin(veca), end(veca)};
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 创建引用向量的优雅方式
- C++重新引用向量中的值
- 很好的语法来获取对向量/数组数据的大小引用?
- 如何返回向量的常量引用?
- 取消引用向量时出现问题
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 通过引用传递向量是请求 std::分配器
- 从类返回引用向量
- 返回两个向量 – 使用引用还是元组?
- 在C++中通过引用传递向量数组
- 引用向量中的特定索引
- 如何告诉自动推断向量<bool>元素的非引用类型
- 如何在方法主体中返回声明向量的引用?
- 向量引用C++
- 在向量引用上调用 vector::reserve()
- 如何创建一个同时接受数组和向量引用的函数模板
- 如何做列表的向量引用列表中的值
- c++向量引用转换
- 最方便的表示向量引用的向量的方法