当编译器没有看到可以实现转换的可能类型时,是否允许编译器优化volatile指针的dynamic_cast?

gez*_*eza 9 c++ dynamic-cast volatile language-lawyer

看看这个小片段:

struct A {
    virtual ~A() { }
};

struct B { };

bool fn() {
    A *volatile a = new A;
    return dynamic_cast<B *>(a); 
}
Run Code Online (Sandbox Code Playgroud)

编译器是否允许dynamic_cast完全删除,并转换dynamic_cast为简单nullptr;

这个问题的原因是这个答案.

笔记:

  • 假设volatile意味着编译器不能假设任何东西a,因为它是volatile.这是一个问题的原因.

  • dynamic_cast可能不被允许删除的事实是程序中某处可能存在某种类型,它来源于AB.

bol*_*lov 2

是的,当且仅当编译器可以证明调用的唯一有效结果是 时,编译器才可以dynamic_cast根据 as-if 规则1)false省略对 的调用。这很简单。

棘手的部分是证明 的唯一有效结果dynamic_castfalse。您可以证明,当且仅当您的整个程序中没有类同时继承自AB

现在我对这部分不太熟悉,但我认为当您创建二进制文件并在程序中拥有所有类型时,仅当它是可执行文件(而不是库)并且仅当程序不动态链接时才可以做到这一点到其他图书馆。


1) ondynamic_cast指针没有副作用,它不会抛出异常