利用可能な最も安全なC++キャストであるため、私はさまざまな感情を抱いてstatic_cast
いますが、同時に安全な変換と安全でない変換の両方を許可するため、実際に安全であるか、UBにつながる可能性があるか(キャスト時など)を判断するためのコンテキストを知る必要がありますサブクラスへ)。
では、なぜより安全な明示的なキャストがないのでしょうか。これが役立つ例です。COMでは、インターフェイスポインタをとして返す必要があるvoid** ppv
ため、明示的にキャストする必要があります
*ppv = (IInterface*) this;
その後、より安全なC++キャストに置き換えることが提案されました
*ppv = static_cast<IInterface*>(this);
しかし、ここでさえ作ることは理にかなっていstatic_cast
ますか?this
から派生したクラスなIInterface
ので、簡単に書くことができます
IInterface* p = this; // implicit conversion to base, safe for sure
*ppv = p;
またはのようなヘルパーを使用します
template<class T, class U>
T implicit_cast(U p) { return p; }
*ppv = implicit_cast<IInterface*>(this);
それで、時々誤用されて、場合static_cast
によってはこれに置き換えることができる(すべきですか?)というのは本当ですか、それとも私は何かを逃していますか?implicit_cast
編集: COMでキャストが必要であることは知っていますが、必ずしもそうである必要はありませんstatic_cast
。暗黙のキャストで十分です。