The literal prefixes are a part of the core language, much like the suffixes:
'a' // type: char
L'a' // type: wchar_t
"a" // type: char[2]
L"a" // type: wchar_t[2]
U"a" // type: char32_t[2]
1 // type: int
1U // type: unsigned int
0.5 // type: double
0.5f // type: float
0.5L // type: long double
Note that wchar_t
has nothing to do with Unicode. Here is an extended rant of mine on the topic.