0

私は変換とテンプレート型パラメーターに関する本を読んでいますが、以下は基本的に私を混乱させています (引用した段落内に質問を書きました)。

"template <typename T> T fobj(T, T);
template <typename T> T fref(const T&, const T&);

int a[10], b[42];
fobj(a,b); //calls f(int*, int*)
fref(a,b); //error: array types don't match

「[この]呼び出しのペアでは、配列が異なるサイズであり、したがって異なる型を持つ配列引数を渡します。[私の質問: 異なるサイズの配列が異なる型と見なされるのはいつからですか?これらの配列は両方とも型ではありません」 int" 配列? これはどういう意味ですか? ] fobj の呼び出しでは、配列の型が異なることは問題ではありません。どちらの配列もポインターに変換されます。ただし、 frefは不正です. パラメータが参照の場合、配列はポインタに変換されません. a と b の型が一致しないため、呼び出しはエラーになります. a と b が一致しないのに、なぜこの呼び出しが違法なのですか?私には理解できません] "

4

1 に答える 1

2

Q1 異なるサイズの配列が異なる型と見なされるのはいつからですか?

いつもから。つまり、これら 2 つの配列の型が異なるということです。

int a[10];
int b[42];

Q2 a と b の型が一致しないのはなぜですか? また、この呼び出しが違法である理由は何ですか? わかりません

それらは異なる型を持ち、明示的aに typeint[10]b持ち、 type を持ちint[42]ます。int*型は、期待する関数に渡される場合など、特定のコンテキストで に減衰する可能性がありint*ます。これは、引用したコードの最初の関数テンプレートで発生することです。テンプレートは次のようなものにインスタンス化されます

int* fobj(int*, int*);

ここまでは順調ですね。ただし、参照によって受け取る関数には、a次のbようなパラメーター リストが必要です。

int foo( int const (&array1)[10], int const (&array2)[42] );

int const (&arr)[N]constは、「 s のサイズN配列への参照」の構文にすぎませintん。同じ型で任意のサイズの要素を持つ 2 つの配列を受け入れることができる関数テンプレートは、次のようになります。

template <typename T, size_t N, size_t M> 
T fref(T const (&)[N], T const (&)[M]);

この関数をabでインスタンス化すると、上記のような関数が得られますfoo()

于 2013-11-09T08:16:36.157 に答える