私はタイプディケイの性質を理解しようとしています。たとえば、配列は特定のコンテキストでポインタに崩壊することをすべて知っています。私の試みはint[]
がint*
とどのように等しいかを理解することですが、2次元配列がどのようにして予想されるポインタ型に対応しないのかを理解することです。ここではテストケースである:なぜint * []はint **に崩壊しますが、int [] []ではなくなりますか?
std::is_same<int*, std::decay<int[]>::type>::value; // true
予想通りこれはtrueを返しますが、これはそうではない:
std::is_same<int**, std::decay<int[][1]>::type>::value; // false
なぜこれが真実ではないでしょうか?私は最終的にそれがtrueを返すようにする方法を見つけ、それがポインタ最初の次元を行うことであった。
std::is_same<int**, std::decay<int*[]>::type>::value; // true
そしてアサーションはポインタではなく、最後には、配列された状態で、あらゆるタイプのためにも当てはまります。たとえば、(int***[] == int****; // true
)です。
なぜこのようなことが起こっているのか説明できますか?配列型がポインタ型に対応しないのはなぜですか?
+1。いい答えだ。 – Nawaz
+1わかりやすい説明。 –
これを見る別の方法は 'int [M] [N]'〜 'int **'に1回の変換(許可される)とは対照的に2回の変換(許可されない)が必要です。最初の変換では、 'int [M] [N]'から*ポインタ*に変換して配列の最初の要素に変換する必要があります。最初の要素の型は 'int [N]'なので、 'int [M] [N]'はまず 'int(*)[N]'に変換します。 *内部*配列 'int [N]'の最初の要素は 'int *'に変換されます。 – Nawaz