いいえ。ACキャストは、、、、、、またはそれらの組み合わせと同等のことを行うことができますconst_cast
。それだけでは不十分な場合は、新しいキャストの組み合わせではまったくできない、少なくとも1つのマイナーなトリックを実行することもできます。static_cast
reinterpret_cast
const_cast
元の変数がなしで定義されている場合は、定義された結果で使用できますconst
が、持っているのはconst
そのオブジェクトへのポインターまたは参照だけです。OTOH、使用する正当な理由があると思われる場合は、代わりにconst_cast
実際に検索する必要がある可能性がありますmutable
。
編集:私はそれをすぐに言うべきだったと思いますが、Cスタイルのキャストはアクセスできない基本クラスに変換することができます。たとえば、次のようなものを考えてみましょう。
[編集:コードをコンパイルして(通常は)問題を示すものに更新しています。]
#include <iostream>
class base1 {
public:
virtual void print() { std::cout << "base 1\n"; }
};
class base2 {
public:
virtual void print() { std::cout << "base 2\n"; }
};
class derived : base1, base2 {}; // note: private inheritance
int main() {
derived *d = new derived;
base1 *b1 = (base1 *)d; // allowed
b1->print(); // prints "base 1"
base2 *b2 = (base2 *)d; // also allowed
b2->print(); // prints "base 2"
// base1 *bb1 = static_cast<base *>(d); // not allowed: base is inaccessible
// Using `reinterpret_cast` allows the code to compile.
// Unfortunately the result is different, and normally won't work.
base1 *bb2 = reinterpret_cast<base1 *>(d);
bb2->print(); // may cause nasal demons.
base2 *bb3 = reinterpret_cast<base2 *>(d);
bb3->print(); // likewise
return 0;
}
sを使用するコードreinterpret_cast
はコンパイルされますが、結果(少なくとも2つのうちの1つ)を使用しようとすると、大きな問題が発生します。は、派生オブジェクトreinterpret_cast
のベースアドレスを取得し、指定されたタイプのベースオブジェクトであるかのように処理しようとします。また、(多くても)1つのベースオブジェクトが実際にそのアドレスに存在できるため、他のオブジェクトと同じように処理しようとします。 /大きな問題を引き起こします。編集:この場合、クラスは印刷するものを除いて基本的に同一であるため、何でも可能ですがほとんどのコンパイラでは、最後の2つは両方とも「ベース1」を出力します。reinterpret_castは、そのアドレスにあるものをすべて取得し、指定されたタイプとして使用しようとします。この場合、私はそれを無害であるが目に見えるものにすることを試みました。実際のコードでは、結果はおそらくそれほどきれいではありません。
Cスタイルのキャストは、コードがプライベートではなくパブリック継承を使用した場合のstatic_castのように機能します。つまり、派生クラスのどこに各基本クラスオブジェクトが「存在」するかを認識し、結果を調整するため、結果の各ポインターは適切な場所を指すように調整されているため、機能します。