Compilación de literales de cadena

¿Por qué se pueden compilar dos literales de cadena separados por un espacio, tabulación o "\ n" sin un error?

int main()
{
   char * a = "aaaa"  "bbbb";
} 

"aaaa" es un char * "bbbb" es un char *

No existe una regla de concatenación específica para procesar dos literales de cadena. Y, obviamente, el siguiente código da un error durante la compilación:

#include <iostream>
int main()
{
   char * a = "aaaa";
   char * b = "bbbb";
   std::cout << a b;
}

¿Es esta concatenación común a todos los compiladores? ¿Dónde está la terminación nula de "aaaa"? ¿Es "aaaabbbb" un bloque continuo de RAM?