gpt4 book ai didi

c++ - 以下reinterpret_cast是否会导致未定义的行为?

转载 作者:行者123 更新时间:2023-11-30 02:25:20 25 4
gpt4 key购买 nike

下面代码中的reinterpret_cast是否会导致未定义的行为?如果确实如此,是否可以以类型安全的方式定义 rpd?

class Base
{
public:
virtual ~Base() = default;
};

class Derived : public Base { };

int main(void)
{
Derived d;
Base* pb = &d;
Base*& rpb = pb;

Derived*& rpd = reinterpret_cast<Derived*&>(rpb);

return 0;
}

与我之前的 recent question 有点相关。这背后的背景;我正在试验一个适配器类,它应该允许包含协变指针类型的 vector 本身用作协变类型。

最佳答案

强制转换本身没有UB(请参阅[expr.reinterpret.cast]),但通过重新解释的引用(rpd)访问引用的指针(rpb) )的作用是:

[basic.lval](标准草案)

If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined:56

56) The intent of this list is to specify those circumstances in which an object may or may not be aliased.

  • (8.1) the dynamic type of the object,

不适用,动态类型是静态类型,即Base*,而不是Derived*,即泛左值的类型。

  • (8.2) a cv-qualified version of the dynamic type of the object,

没有简历资格,并且类型仍然不匹配。

  • (8.3) a type similar to the dynamic type of the object,

不适用。这是关于 cv 限定符分解的内容,请参阅 [conv.qual](抱歉,段落中的许多下标在 html 中输入很麻烦,并且是保持文本可读性所必需的)。

  • (8.4) a type that is the signed or unsigned type corresponding to the dynamic type of the object,

仅与整数类型相关。

  • (8.5) a type that is the signed or unsigned type corresponding to a cv-qualified version of the dynamic type of the object,

同上。

  • (8.6) an aggregate or union type that includes one of the aforementioned types among its elements or non-static data members (including, recursively, an element or non-static data member of a subaggregate or contained union),

Derived* 既不是聚合也不是 union 。

  • (8.7) a type that is a (possibly cv-qualified) base class type of the dynamic type of the object,

Derived* 不是 Base* 的基础。

  • (8.8) a char, unsigned char, or std​::​byte type.

派生* 都不是这些。


由于没有任何异常(exception)情况适用,因此通过 Derived* 类型的泛左值访问 Base* 的行为未定义。


I am experimenting with an adapter class that should allow vectors containing covariant pointer types to be used as covariant types themselves.

您的实验将无法坚持基本的面向对象原则。

基引用与派生对象是协变的,因为您无法通过基引用对派生对象执行任何无法对派生对象本身执行的操作。

基类型的容器不能与派生类型的容器协变,因为您可以使用基类型的容器(通过“引用”容器派生的)基类型执行某些操作,而使用派生类型的容器则无法执行此操作:添加以下对象:其他派生类型。

尽管如此,如果容器是不可变的……它在概念上可能会起作用。实际上用 C++ 实现它是另一回事。

关于c++ - 以下reinterpret_cast是否会导致未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44338559/

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