gpt4 book ai didi

c++ - 将指针转换为指针引用会导致未定义的行为吗?

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

我遇到了以下丑陋的代码,想知道标准对此有何规定。调用 foo() 是否被认为会导致未定义的行为?或者它是无害的?

#include <iostream>

class Base {};
class Derived : public Base {};

void foo(Base *&b)
{
std::cout << "foo" << std::endl;
}

int main()
{
Derived *der = new Derived();

foo((Base *&)der);

return 0;
}

我相信丑陋的 c-cast 已经完成,因为简单的 (Base *) cast 会导致编译错误。即便如此,它现在编译是否只是因为严格的别名?还是标准允许转换为引用?

最佳答案

这是相当 UB,因为您有效地重新解释派生指针作为基指针。原因是您没有将 Derived 指针转换为 Base 指针,而是将 T& 转换为 U& - 虽然 TU 具有相同的大小和对齐方式(都是对象指针类型),但它们不是 static_cast-能够相互融合。这反过来又要求 C 风格的强制转换表现为 reinterpret_cast

虽然它通常 (tm) 在您的情况下实际工作(基础子对象位于派生对象的索引 0 处),但当您使用多重继承或虚拟继承时,预计它会 (tm) 失败。

通过执行以下操作可以很容易地达到预期的效果:

Derived* der = new Derived();
Base* base = der; // conversion to base
foo(base);
der = static_cast<Derived*>(base); // assumes that whatever base points to now is also (derived from) Derived

请注意,一般来说,在强制转换中使用引用不是问题。例如:

Derived derived;
Base& base = static_cast<Base&>(derived); // equivalent to *static_cast<Base*>(&derived)

关于c++ - 将指针转换为指针引用会导致未定义的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57141567/

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