【问题标题】:Implicit type conversion with reference to void*引用 void* 的隐式类型转换
【发布时间】:2013-10-13 22:17:36
【问题描述】:

我想编写一个函数来修改任何类型的给定指针;因此我声明我的函数接受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*”隐式转换规则起作用,“TT& 隐式转换规则起作用,但不能同时起作用?为什么会这样?什么做我错了吗?

(我知道我可以为 f 使用模板函数,这主要是出于好奇)。

【问题讨论】:

  • stackoverflow.com/questions/399003/…"不保证 sizeof(int *) == sizeof(double *)" - 因此无法生成符合您要求的非模板化代码。
  • @KarolyHorvath: void* 总是大到足以容纳任何对象指针。如果对象指针的可能大小差异(顺便说一句,在实际实现中看不到)是真实的和有意的,或者只是对分散的标准措辞的挑剔解释,这也是值得商榷的。
  • @PlasmaHH:我不确定你打算用这个传达什么......如果代码只是将 void* 的内存位置归零(足够大),可能会覆盖内存位置另一个变量?
  • @KarolyHorvath:除了它不能编译(因为临时变量不能绑定到非 const 引用)之外,如果它是合法的,它很可能会做预期的事情,因为在对象指针的大小纯粹是理论上的,就像推测非法语言结构的可能行为一样。
  • 考虑这样一种情况,你写的是new std::vector<int>,而不是f中的0。您知道这种转换实际上有多安全吗?

标签: c++ reference implicit-conversion


【解决方案1】:

这是因为引用位。对指向一种类型的指针的引用与对另一种类型的指针的引用不同。

这当然可以通过使用模板来解决:

template<typename T>
void f(T*& x) { ... }

【讨论】:

    【解决方案2】:

    如果它可以在这里工作,你可以从T* 中创建一个临时的void*(因为这里的转换实际上意味着“创建另一个类型的新对象”),然后你会绑定一个引用,这会赢得'不起作用,因为它是非常量的。不过可行的是:

    void f(void* const & x)
    {   
         x = 0; 
    }
    

    但这可能不是您想要的,因为它指的是临时的,而不是int*

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2016-02-17
      • 2015-04-26
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多