Perché int * decade in int ** ma non int ?

Sto cercando di capire la natura del decadimento. Ad esempio, tutti sappiamo che gli array si decompongono in puntatori in un determinato contesto. Il mio tentativo è di capire come int[] equivale a int* ma in che modo gli array bidimensionali non corrispondono al tipo di puntatore previsto. Ecco un caso di test:

 std::is_same<int*, std::decay::type>::value; // true 

Ciò restituisce true come previsto, ma ciò non vale:

 std::is_same<int**, std::decay::type>::value; // false 

Perché non è vero? Ho finalmente trovato un modo per renderlo vero, e cioè rendendo la prima dimensione un puntatore:

 std::is_same<int**, std::decay::type>::value; // true 

E l’affermazione vale per qualsiasi tipo di puntatori, ma con l’ultimo è l’array. Ad esempio ( int***[] == int****; // true ).

Posso avere una spiegazione del perché questo sta accadendo? Perché i tipi di array non corrispondono ai tipi di puntatore come ci si aspetterebbe?