違いは何ですか
int a;
// a gets some value
double pi = static_cast<double>(a)/3;
と
int a;
// a gets some value
double pi = double(a)/3;
後者を見たことがありますか?Stroustrup によって書かれたいくつかのスニペットでそれを見たようですが、参照が見つかりません。
キャストではなく構築していると思った人もいるかもしれません。検討:
some_fun(std::string("Hello"));
多くの人は、実際には C スタイルのキャストを行っているときに、そこでコンストラクターを呼び出していると考えています。たまたま、キャストが他のものの長いリストの中からターゲット型のコンストラクターを調べ、最終的にコンストラクターを呼び出すことになります。
関数表記のキャストには、他の種類の C キャストと同じ弱点があります。
それ以外にも、どちらの場合もまったく同じ操作を実行しています。
後者は、 として扱われるべきであると明示的に言う明示的なキャストの関数表記法と呼ばれます。この手法を使用すると、ほとんどすべてを任意の型にキャストできます。a
double
前者は、C++ で型をキャストするための推奨される方法です。キャスト先の型が意味を成していることを確認するための基本的なチェックを行います (基本クラス ポインターへの子クラス ポインターなど)。さらに、示した例のように、暗黙的な変換を実行できます。技術的にはstatic_cast
、あなたの例では明示的ですが、操作の結果 (代入) は暗黙的です。
と の間で生成されるアセンブリ コードに違いはありませstatic_cast<double> (a)
ん(double) a
。キャスト表記 の主な利点は、(type_id) cast_expression
柔軟性が高いことです。const_cast
ある状況では、別の状況では 、さらに別の状況では 、さらに別static_cast
の状況ではと(または)dynamic_cast
の組み合わせと同等である可能性があります。const_cast
static_cast
dynamic_cast
この強みは弱みでもあります。キャスト表記は場所によって意味が異なります。もう 1 つの欠点は、非常に見つけやすいことxxx_cast<type_id> (cast_expression)
です。を検索するだけです_cast
。キャスト表記を使用する式を見つけるのは非常に困難です。
static_cast の使用は安全な C++ スタイルの方法ですが、(double) - 安全でない古い C スタイルの方法です。
こちらを参照してください:型キャスト