引用 void* 的隐式类型转换
Implicit type conversion with reference to void*
我想写一个函数来修改任何类型的给定指针;因此我声明我的函数接受void*&
,依赖于从任何指针到void*
的隐式转换。但是,以下代码拒绝编译,说它无法将int*
转换为void*&
。
void f(void*& x)
{
x = 0;
}
int main() {
int* a = new int;
f(a);
delete a;
return 0;
}
请注意,如果 f 被声明为接受int*&
(但随后失去其通用性)或如果 f 被声明为接受void*
(但 f 只能在本地修改其参数),则它工作正常。
因此,"任何T*
void*
"隐式转换规则独立地起作用,"T
到T&
隐式转换规则有效,但不能同时工作?为什么会这样?我在这里做错了什么?
(我知道我可以为 f 使用模板函数,这主要是出于好奇)。
这是因为引用位。对指向一种类型的指针的引用与对另一种类型的指针的引用不同。
这当然可以通过使用模板来解决:
template<typename T>
void f(T*& x) { ... }
如果它在这里有效,您将在T*
中创建一个临时void*
(因为这里的转换实际上意味着"创建另一种类型的新对象"),然后您将绑定引用,这将不起作用,因为它是非常量。不过,有效的是:
void f(void* const & x)
{
x = 0;
}
但这可能不是您的意图,因为它指的是临时的,而不是int*
。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 将可变参数模板类型转换为 void,预期')'之前
- 关于void指针、类和类型转换
- 类型转换时C++ (void *) 变量和 (void *&) 变量有什么区别
- 类型转换指向 int 的 void 指针时出错
- 如何将 void 指针类型转换为 int 指针,然后在其中存储 int
- 无法从 void* 类型转换(类名::)() 以键入 void*(*)(void*)
- 引用 void* 的隐式类型转换
- 类型转换并将 void 指针变量分配给 VC++ 中的整数变量
- C++类型转换:将指针从 void 指针转换为类指针
- 将void指针类型转换为int时出现分段错误
- 为什么c++中需要从void指针进行类型转换
- 是否有一种方法可以自动转换void指针的类型
- CUDA:__device__和__global__错误:在"无符号"/"void"之前预期的构造函数、析构函数或类型转换"
- 提取2个指针类型转换为(void*)
- 不能在类型转换为void *的对象上调用成员函数指针
- CUDA 错误:'void'之前的预期构造函数、析构函数或类型转换
- 重新解释不带类型标识符的强制转换void
- 为什么它会在 arduino uno 代码中将错误:预期的构造函数、析构函数或类型转换放在"void"之前?