gpt4 book ai didi

c++ - 通过引用传递时的指针转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:07 26 4
gpt4 key购买 nike

看看我的代码,我可以使用两个步骤将 GoodMan 指针转换为 Man 指针并传递给 AddMan 函数。但是当我用一个步骤来做到这一点时,它不起作用。相反,它需要转换为 Man 显式指针引用,而不仅仅是 Man 指针。这背后的原因是什么?

    class Man{
};

class GoodMan: public Man
{
};

void AddMan(Man*& man){};

int main()
{
GoodMan* good_man = new GoodMan() ;

//This works
Man* pMan2 = (Man*)good_man;
AddMan(pMan2);

//So I think this should work, But doesn't work
AddMan((Man*)good_man);

//But this works
AddMan((Man*&)good_man);

return 0;
}

最佳答案

C++ 不允许将诸如 (Man*)good_man 之类的右值(基本上是临时值)绑定(bind)到诸如 Man*& 之类的非常量左值引用。在您的代码中,pMan2 是一个左值,因此它可以绑定(bind)到 AddMan 的非常量引用参数。但是 (Man*)good_man 是一个右值。这是错误的原因。

如果您更改 AddMan 的签名以采用 const 左值引用,您的代码将编译。

void AddMan(Man* const& man){};

当然,这不允许您更改作为参数传递的指针。另一方面,你的解决方案,转换为左值引用,就编译代码而言“有效”。但是你必须问问自己,修改 AddMan 函数内部的指针意味着什么。

AddMan((Man*&)good_man); // "works" by pretending everything is OK. It isn't.

关于c++ - 通过引用传递时的指针转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27616465/

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