キャプテン衒学者が救助に!
あなたが書くなら
int(value)
これは明示的な型変換として知られているものであり、§5.2.3によって管理されます。正確な言い回しはそれを言います
単純型指定子(7.1.5)の後に括弧で囲まれた式リストが続くと、式リストで指定された型の値が作成されます。式リストが単一の式である場合、型変換式は、対応するキャスト式(5.4)と同等です(定義において、および意味で定義されている場合)。
(私の強調)。つまり、これは
int(value)
と
(int)value
互いに完全に同一です。これらのうち、書きやすいと思うものを選ぶのはあなた次第です。
2番目の質問ですが、テンプレートと配列を使った例では、あなたが書くつもりだったのはこのようなものだったと思います。
template <typename T, size_t N>
size_t (T (&)[N]) {
return N;
}
ここにN
は、テンプレートパラメータもあります。これを使用すると、コンパイラに配列内の要素の数をT
入力させながら、任意の配列を渡すことができます。N
これが紛らわしいように見える場合(一体何T (&)[N]
ですか?)、これはこの関数がタイプのパラメーターを取り込んでいるためですT (&)[N]
。これを少し読みやすくするために、次に示すように、このパラメーターに名前を付けましょう。
template <typename T, size_t N>
size_t (T (&array)[N]) {
return N;
}
これで少し読みやすくなると思います。しかし、この宣言はどういう意味ですか?
T (&array)[N]
これは、正確に要素のsのarray
配列への参照であると呼ばれる変数を宣言します。配列へのポインタを宣言できるのと同じように、実際に配列への参照を宣言できます。これは実際にはあまり一般的ではありませんが、この特定のテンプレートイディオムは、配列をテンプレート引数に一致させようとするときに、コンパイラに配列のサイズを推測させる優れた方法です。T
N
この場合の括弧の理由は、
T& array[N]
コンパイラはこれを「オブジェクトarray
の配列であると呼ばれる変数であり、それぞれがです。ただし、C ++仕様では参照の配列が特に許可されておらず、これは違法です。括弧はこれを明示的に明確にします。これは関数に似ています。ポインタ-あなたが書くN
T&
void (*functionPointer)()
それ以外の
void *functionPointer()
コンパイラに、を返す関数ではなく、ポインタである*
ことを意味することを認識させるため。functionPointer
void *
コンパイラがそれぞれの方法で括弧を処理するタイミングを決定する方法に関しては、ルールはかなり複雑であり、実際には、コンパイラが意図した方法で式を解析しない状況がいくつかあります。これらのケースの1つは、口語的に「最も厄介な解析」と呼ばれるもので、コンパイラはオブジェクト構築のように見えるものを関数プロトタイプとして扱います。例として、このコードは次のとおりです。
vector<int> v();
デフォルトのコンストラクターを使用して初期化された呼び出されたものを作成しません。代わりに、これを、引数をとらずに!を生成するという関数の関数プロトタイプとして扱います。しかし、あなたが書くとしたらvector<int>
v
v
vector<int>
vector<int> v(10);
vector<int>
次に、コンパイラーは、これがコンストラクター引数としての受け渡しの宣言であると明確に推測できます。これは10
、関数プロトタイプとして扱うことができないためです。仕様の§6.8と§8.2は、宣言として扱うことができるものはすべて、関数プロトタイプとして扱うことができるものはすべてそうなると言って、これらのケースを処理します。
配列のコンテキスト(つまり、T (&array)[N]
)での括弧の場合は、変数を宣言したり、型に明示的な括弧が必要なパラメーターを定義したりするコンテキストでは、あいまいさがないため、別のロジックで処理されます。変数を宣言するために型に名前を付けていることがコンテキストから明らかであるため、意図について。
要約する -
- フォームのキャスト
T(value)
と(T)value
同一です。
- の括弧は
T (&array)[N]
、コンパイラが意図したとおりに&
toT
ではなくtoをバインドしないようにするためのarray
ものです。
- 括弧の特定の使用は通常、コンテキストから推測されますが、変数宣言と関数プロトタイプの間でいくつかの問題が発生する可能性があります。
お役に立てれば!