1) decltype e' un operatore del C++11 usato solo durante il processo di compilazione il cui compito e' quello di di dire:
voglio usare come tipo della variabile/parametro/valore di ritorno, lo stesso tipo dell'espressione che ti ho indicato tra parentesi
E' utile sopprattuto con i template perche' i template associati alle collezioni definiscojo dei tipo (puntatori, reference, il tipo dell'indice del vettore, ecc) che potrebbe risultare complicato scrivere a mano, sopprattutto se il template dipende da un tip che a sua volta e' un template ...
2) poiche' il tipo dell'indice in un vector deve essere dello stesso tipo numerico di vector.size(), ecco del perche' del'espressione decltype(ivec.size()
Per quanto riguardano le castronate (alias disaster ):
1) instanzi un vettore di lunghezza 0 e tenti di inserire degli elementi agli indici 0...9: crash assicurato . Il vectori si ridimensiona dinamicamente, ma solo se usi il metodo corretto: push_back
2) ivec.size() e' di tipo size_t fondamentalmente un unsigned int mentre il tuo vettore contiene degli int: c'e' un problema di segno nell'assegnazione