質問

違いは何ですか

(type)value

and

type(value)

C ++の場合

役に立ちましたか?

解決

違いはありません。標準(§5.2.3)に従って:

simple-type-specifier(7.1.5)の後に括弧で囲まれたexpression-listが続くと、指定された型の値が式リストに基づいて構成されます。式リストが単一の式である場合、型変換式は、対応するキャスト式(5.4)と同等です(定義済みで、意味で定義されている場合)。

質問では type(value)(type)value の違いが指定されているため、まったく違いはありません。

値のコンマ区切りのリストを処理する場合にのみ、違いがあります。この場合:

式リストが複数の値を指定する場合、型は適切に宣言されたコンストラクター(8.5、12.1)を持つクラスである必要があり、式T(x1、x2、...)は事実上宣言T tと同等です。 (x1、x2、...);いくつかの一時変数tが発明され、結果は右辺値としてのtの値になります。

Trubadourが指摘したように、 type(value)バージョンが単にコンパイルされない型の特定の名前があります。例:

char *a = (char *)string;

コンパイルされますが、:

char *a = char *(string);

はしません。ただし、同じ名前の別の名前(たとえば、 typedef で作成されたもの)は機能します。

typedef char *char_ptr;

char *a = char_ptr(string);

他のヒント

違いはありません。 C ++標準(1998年および2003年版)はこの点について明確です。次のプログラムを試してください。 http://comeaucomputing.com/の無料プレビューなど、準拠しているコンパイラを使用していることを確認してください。 tryitout /

#include <cstdlib>
#include <string>
int main() {
  int('A'); (int) 'A'; // obvious
  (std::string) "abc"; // not so obvious
  unsigned(a_var) = 3; // see note below
  (long const&) a_var; // const or refs, which T(v) can't do
  return EXIT_SUCCESS;
}

注: unsigned(a_var)は異なりますが、これらの正確なトークンが他の何かを意味する1つの方法を示しています。これは、unsigned型の a_var という名前の変数を宣言しており、キャストではありません。 (関数または配列へのポインタに精通している場合は、 void(* pf)()または<のようなタイプで p の周りに括弧を使用する方法を検討してくださいcode> int(* pa)[42] 。)

(これらのステートメントは値を使用せず、ほぼ間違いなくエラーになる実際のプログラムでは警告が生成されますが、すべてが引き続き機能します。すべてを行にした後、変更する心がありませんでした上)。

両方がキャストの場合は違いはありませんが、「type(value)」がキャストではない場合があります。

標準ドラフトN3242、セクション8.2.1の例を次に示します。

struct S 
{
    S(int);
};

void foo(double a) 
{
    S w( int(a) ); // function declaration
    S y( (int)a ); // object declaration
}

この場合、「int」は値ではないため、「int(a)」はキャストではありません。これは、冗長な括弧で囲まれたパラメーター名です。ドキュメントの状態

  

関数スタイル間の類似性から生じる曖昧さ   6.8で述べられているキャストと宣言は、コンテキスト内でも発生します。   宣言の。そのコンテキストでは、選択は関数間で行われます   パラメータを囲む括弧の冗長セットを持つ宣言   名前と、関数スタイルのキャストを含むオブジェクト宣言   初期化子。 6.8で述べた曖昧さに関しては、   解決策は、おそらく   宣言を宣言します。

cには type(value)はありませんが、c / c ++には type(value)(type)value の両方があります許可されています。

C ++でオプションを説明するために(1つだけに安全性チェックがあります)

#include<boost/numeric/conversion/cast.hpp> 

using std::cout;
using std::endl;
int main(){

    float smallf = 100.1;

    cout << (int)smallf << endl; // outputs 100 // c cast
    cout << int(smallf) << endl; // outputs 100 // c++ constructor = c cast

    cout << static_cast<int>(smallf) << endl; // outputs 100
//  cout << static_cast<int&>(smallf) << endl; // not allowed
    cout << reinterpret_cast<int&>(smallf) << endl; // outputs 1120416563
    cout << boost::numeric_cast<int>(smallf) << endl; // outputs 100

    float bigf = 1.23e12;

    cout << (int)bigf << endl; // outputs -2147483648
    cout << int(bigf) << endl; // outputs -2147483648

    cout << static_cast<int>(bigf) << endl; // outputs -2147483648
//  cout << static_cast<int&>(bigf) << endl; // not allowed
    cout << reinterpret_cast<int&>(bigf) << endl; // outputs 1401893083
    cout << boost::numeric_cast<int>(bigf) << endl; // throws bad numeric conversion
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top