通过指向其派生类的指针访问类对象是否会破坏严格的别名规则?

oba*_*oba 6 c++

void foobar(Base* base)
{
    Derived* derived = dynamic_cast<Derived*>(base); // or static_cast
    derived->blabla = 0xC0FFEE;
    if (base->blabla == 0xC0FFEE)
        ...
}
Run Code Online (Sandbox Code Playgroud)

在具有严格别名的编译器上,"派生"是"base"的别名吗?

ava*_*kar 5

只要有可能通过它们访问同一个对象,就会有两个指针别名.该标准的第3.10/15段规定了对对象的访问何时有效.

如果程序试图通过不同于以下类型之一的左值访问对象的存储值,则行为未定义:

  • 对象的动态类型,
  • 一个cv限定版本的动态类型的对象,
  • 与对象的动态类型对应的有符号或无符号类型的类型,
  • 一种类型,是有符号或无符号类型,对应于对象动态类型的cv限定版本,
  • 一种聚合或联合类型,包括其成员中的上述类型之一(包括递归地,子聚合或包含联合的成员),
  • 一个类型,它是对象动态类型的(可能是cv限定的)基类类型,
  • char或unsigned char类型.

在您的情况下,*derived它是对象的动态类型的l值,或者是对象的动态类型的基类类型.*base是一种类型,它是对象动态类型的基类类型.

因此,你被允许通过这两种访问对象derivedbase,使得别名两个指针.