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可能不被允许删除的事实是程序中某处可能存在某种类型,它来源于A和B.
是的,当且仅当编译器可以证明调用的唯一有效结果是 时,编译器才可以dynamic_cast根据 as-if 规则1)false省略对 的调用。这很简单。
棘手的部分是证明 的唯一有效结果dynamic_cast是false。您可以证明,当且仅当您的整个程序中没有类同时继承自A和B。
现在我对这部分不太熟悉,但我认为当您创建二进制文件并在程序中拥有所有类型时,仅当它是可执行文件(而不是库)并且仅当程序不动态链接时才可以做到这一点到其他图书馆。
1) ondynamic_cast指针没有副作用,它不会抛出异常