Если вы напишите 'A'
, и это значение будет преобразовано в wchar_t
, то, по крайней мере, в компиляторах Microsoft оно будет иметь то же значение, что и при написании L'A'
или _T('A')
.
То же самое нельзя сказать о строковых литералах, поскольку нет полезного преобразования из const char*
в const wchar_t*
. Я думаю, это означает, что гораздо менее важно правильно понять типы литералов символов, чем строковые литералы.
Легко написать код, который ведет себя по-разному в зависимости от того, является ли символьный литерал широким или узким - просто есть перегруженная функция, которая делает что-то совершенно другое. Но на практике разумные функции, перегруженные для приема обоих типов символов, в конечном итоге будут делать то же самое с 'A'
, что и с L'A'
. А функции, которые не перегружены и занимают только wchar_t
, могут нормально работать 'A'
.
Я не сразу вижу в стандарте ничего, что требовало бы L'A' == (wchar_t)'A'
, поэтому теоретически компиляторы сторонних разработчиков могут сделать что-то совершенно другое. Но вы обычно ожидаете, что широкий набор символов будет расширением узкого набора символов, так же как Unicode расширяет ISO-8859-1. Чтобы быть точным, что означает «расширение», кодовые точки, которые равны целым числам, обозначают «один и тот же символ».