34

違いは何ですか

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 によって書かれたいくつかのスニペットでそれを見たようですが、参照が見つかりません。

4

4 に答える 4

22

キャストではなく構築していると思った人もいるかもしれません。検討:

some_fun(std::string("Hello"));

多くの人は、実際には C スタイルのキャストを行っているときに、そこでコンストラクターを呼び出していると考えています。たまたま、キャストが他のものの長いリストの中からターゲット型のコンストラクターを調べ、最終的にコンストラクターを呼び出すことになります。

関数表記のキャストには、他の種類の C キャストと同じ弱点があります。

  • うっかりconstnessを捨てることができます
  • 静かに再解釈キャストに変わることができます
  • grep ツールで区別するのが難しい。

それ以外にも、どちらの場合もまったく同じ操作を実行しています。

于 2012-05-03T20:07:47.793 に答える
10

後者は、 として扱われるべきであると明示的に言う明示的なキャスト関数表記法と呼ばれます。この手法を使用すると、ほとんどすべてを任意の型にキャストできます。adouble

前者は、C++ で型をキャストするための推奨される方法です。キャスト先の型が意味を成していることを確認するための基本的なチェックを行います (基本クラス ポインターへの子クラス ポインターなど)。さらに、示した例のように、暗黙的な変換を実行できます。技術的にはstatic_cast、あなたの例では明示的ですが、操作の結果 (代入) は暗黙的です。

于 2012-05-03T19:45:28.740 に答える
6

と の間で生成されるアセンブリ コードに違いはありませstatic_cast<double> (a)(double) a。キャスト表記 の主な利点は、(type_id) cast_expression柔軟性が高いことです。const_castある状況では、別の状況では 、さらに別の状況では 、さらに別static_castの状況ではと(または)dynamic_castの組み合わせと同等である可能性があります。const_caststatic_castdynamic_cast

この強みは弱みでもあります。キャスト表記は場所によって意味が異なります。もう 1 つの欠点は、非常に見つけやすいことxxx_cast<type_id> (cast_expression)です。を検索するだけです_cast。キャスト表記を使用する式を見つけるのは非常に困難です。

于 2012-05-03T20:12:55.420 に答える
2

static_cast の使用は安全な C++ スタイルの方法ですが、(double) - 安全でない古い C スタイルの方法です。

こちらを参照してください:型キャスト

于 2012-05-03T19:44:01.440 に答える