"bolshik" <29601@users.rsdn.ru> wrote in message
news:1783221@news.rsdn.ru...
> Здравствуйте, rg45, Вы писали:
>
> R>Это означает, что каждый символ этого строкового литерала имеет размер два байта (unicode)
>
> правильно я понимаю, что это относится только к строковым литералам?
> Не поделишься ссылкой, где можно почитать, что еще можно применять к строковым литералам?
Вообще символ L образовался от Long и может применяться не только к строковым литералам.
Например литерал 123123123123123123L задает 64-разрядную целочисленную знаковую константу.
п. 2.13 стандарта дает подробное описание всех возможных в С++ литералов.
В MSDN это тоже есть.
Posted via RSDN NNTP Server 1.9
Здравствуйте, Demay, Вы писали:
D>Здравствуйте, _Winnie, Вы писали:
D>Можно явно указать шаблонную функцию:
D>D>WideToUTF8<>(L"hello", s);
D>
В этом-то и фича, что бы явно ничего не указывать. Шаблонная функция здесь выступает в роли хелпера, о которой вообще никто не должен знать по-хорошему. Просто тихо оптимизирует вычисление длины. Ну я так понимаю ситуацию.
Второй момент, что возлагать это на юзера плохо — всё равно ведь не досмотрит — компилятор надёжнее.
Здравствуйте, _Winnie, Вы писали:
_W>...
_W>Когда я вызываю
_W>WideToUTF8(L"hello", s)
_W>то вызывается версия которая принимает указатель, а не ссылку на массив. Почему? Как исправить?
Смотри — с такими вещами надо быть осторожно. Если эта функция используется только как ты привёл: WideToUTF8(L"hello", s); то тогда нормально. А если она используется по-разному и разными людьми, то можно получить нехорошую ситуацию:
wchar_t buf[4096] = {0};
...
someFuncThatFillsBuffer(buf, 1024, ...);
std::string s;
WideToUTF8(buf, s);
В выделенной строчке получишь поведение, которое не совсем ожидалось.
У меня была похожая ситуация и я в целях безопасности для входных буферов оставил только сигнатуру с (const char*), а длина всегда считается автоматически. Т.к. использовались эти функции хаотически и разными людьми.
А вот для выходных буферов это действительно очень полезно:
std::string s = "...";
wchar_t buf[4096] = {0};
WideToUTF8(s, buf);
Размер массива в WideToUTF8 можно сразу на 1 уменьшить, что бы не потереть завершающий ноль.
Тут сразу 3 оптимизации: и память динамически не выделяется под выходной буфер и длина выходного буфера не считается и длина входного буфера не считается, т.к. std::string