Perché questo codice con ‘1234’ è compilato in C ++?

Perché questo compila:

char ch = '1234'; //no error 

Ma non più di 4 char :

 char ch = '12345'; //error: Too many chars in constant 

(Sì, so che ' ' è usato per un char " " e " " è per archi, stavo solo sperimentando)

Questo ha qualcosa a che fare con il fatto che i char vengono rappresentati utilizzando i numeri ASCII?

È un letterale multi-carattere e ha un tipo di int .

C ++ 11 §2.13.2 Caratteri letterali

Un carattere letterale è uno o più caratteri racchiusi tra virgolette singole, come in 'x' , opzionalmente preceduti dalla lettera L , come in L'x' . Un letterale di carattere che non inizia con L è un letterale di carattere ordinario, noto anche come letterale a caratteri stretti. Un letterale di carattere ordinario che contiene un singolo c-char ha carattere char, con valore uguale al valore numerico della codifica del c-char nel set di caratteri di esecuzione. Un letterale di carattere ordinario che contiene più di un c-char è un letterale multi-carattere. Un valore letterale di tipo int -carattere ha tipo int e valore definito dall’implementazione.

C ++ ha qualcosa chiamato “letterali multicharacter”. '1234' è un esempio di uno. Hanno tipo int , ed è definito dall’implementazione quale valore hanno e quanti caratteri possono contenere.

Non ha nulla a che fare direttamente con il fatto che i caratteri sono rappresentati come numeri interi, ma è probabile che nella tua implementazione il valore di '1234' sia definito come:

 '1' + 256 * '2' + 256 * 256 * '3' + 256 * 256 * 256 * '4' 

o:

 '4' + 256 * '3' + 256 * 256 * '2' + 256 * 256 * 256 * '1'