実行時の要因/変数/入力のすべての可能な組み合わせでテストした限り、確かに。コメントで述べたように、これはアサーションの削除に似ています。
キャストが常に正しいという必要な保証があれば、これを本質的に危険にする言語はありません。ただし、そのような保証を行うことはおそらくできないという点で、本質的に安全ではないと感じます.
アップデート
Konstantin は、多重継承を処理する場合、この手法は継承ツリーを 1 ステップ上/下に移動する場合にのみ機能することを証明しました1。
struct A1 { virtual ~A1() {} };
struct A2 { virtual ~A2() {} };
struct A3 { virtual ~A3() {} };
struct B : A1, A2 {};
struct C : A1, A3, A2 {};
int main() {
A1* a1 = (rand() < RAND_MAX / 2 ? (A1*)new B : (A1*)new C);
A2* p1 = dynamic_cast<A2*>(a1);
// ^ succeeds, but is a cross-cast
// A2* p2 = static_cast<A2*>(a1);
// ^ ill-formed
A2* p3 = static_cast<A2*>(static_cast<B*>(a1));
// ^ must chain, instead.
// but p3 is invalid because we never
// checked that `dynamic_cast<B*>(a1)` is valid.. and it's not
// Instead, let's expand the `dynamic_cast`s into a chain, too:
A2* p3 = dynamic_cast<B*>(a1);
A2* p4 = dynamic_cast<A2>*(a1);
// ^ p3 fails, so we know that we cannot use `static_cast` here
}
dynamic_cast
したがって、 s をstatic_cast
s iffに置き換えることができます。
- それぞれが1 つのステップ アップまたはダウン
dynamic_cast
のみを実行します。
- それぞれ
dynamic_cast
が常に成功することが知られています。
1実際には、たとえば、ダウンキャストは任意の数のステップで機能するため、これは少し単純化されています。しかし、それは良い経験則になります。