Здравствуйте, _Winnie, Вы писали:
_W>Когда я вызываю _W>WideToUTF8(L"hello", s) _W>то вызывается версия которая принимает указатель, а не ссылку на массив. Почему?
Наверно потому что нешаблонная функция имеет преимущество перед шаблонной.
оффтоп (злостный)
сейчас возник экспромт связанный с твоим ником: in Winnie veritas
Re: строковый литерал - массив, указатель, шаблон функции
Здравствуйте, _nn_, Вы писали:
__>Баг VC. __>В VC 8.0 тоже он есть __>Об этом писали на форуме.
Почему баг?
У обоих функций точное соответствие, при этом предпочтение отдается нешаблонной, как сказал korzhik.
См. 13.3.3.1.1/3 табл. 9, Array-to-pointer conversion имеет rank — Exact Match.
Вроде так...
Как исправить? Сделать обе шаблонными?
Re[2]: строковый литерал - массив, указатель, шаблон функции
Здравствуйте, Нахлобуч, Вы писали:
Н>Здравствуйте, korzhik, Вы писали:
K>>оффтоп (злостный) K>>сейчас возник экспромт связанный с твоим ником: in Winnie veritas
Н>Это "Истиина в словах Винни" штоль ?
ну типа того
Re[3]: строковый литерал - массив, указатель, шаблон функции
Здравствуйте, shank, Вы писали:
S>Здравствуйте, _nn_, Вы писали:
__>>Баг VC. __>>В VC 8.0 тоже он есть __>>Об этом писали на форуме.
S>Почему баг? S>У обоих функций точное соответствие, при этом предпочтение отдается нешаблонной, как сказал korzhik. S>См. 13.3.3.1.1/3 табл. 9, Array-to-pointer conversion имеет rank — Exact Match. S>Вроде так...
Для функции, которая получает ссылку, нет вообще никакого преобразования и она проигрывает ?
S>Как исправить? Сделать обе шаблонными?
В VC следущий код не работает правильно:
void f(const char (&a)[2]){}
void f(const char* a){}
f("a"); // error C2668: 'f' : ambiguous call to overloaded function :maniac:
Здравствуйте, _Winnie, Вы писали:
_W>Когда я вызываю _W>WideToUTF8(L"hello", s) _W>то вызывается версия которая принимает указатель, а не ссылку на массив. Как исправить?
возможно тебе тут надо решение подобное boost.range
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, _Winnie, Вы писали:
_W>>Когда я вызываю _W>>WideToUTF8(L"hello", s) _W>>то вызывается версия которая принимает указатель, а не ссылку на массив. Как исправить?
K>возможно тебе тут надо решение подобное boost.range
кстати оказалось что boost::range для литералов вызывает strlen. печально
Re[6]: строковый литерал - массив, указатель, шаблон функции
Здравствуйте, _nn_, Вы писали:
__>Я неправильно понял вашу идею сначала
А теперь я ее не понял
Почему компилится как я показал раньше, но не компилится так?
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, korzhik, Вы писали:
K>>Здравствуйте, _Winnie, Вы писали:
_W>>>Когда я вызываю _W>>>WideToUTF8(L"hello", s) _W>>>то вызывается версия которая принимает указатель, а не ссылку на массив. Как исправить?
K>>возможно тебе тут надо решение подобное boost.range
K>кстати оказалось что boost::range для литералов вызывает strlen. печально
А что если предложить улучшение boost.range ?
Или нет переносимого решения раз не реализовали ?
"_Winnie" <23256@users.rsdn.ru> wrote in message news:1782668@news.rsdn.ru... >... > Когда я вызываю > WideToUTF8(L"hello", s) > то вызывается версия которая принимает указатель, а не ссылку на массив. Почему? Как исправить?
Здравствуйте, shank, Вы писали:
S>Здравствуйте, _nn_, Вы писали:
__>>Я неправильно понял вашу идею сначала S>А теперь я ее не понял S>Почему компилится как я показал раньше, но не компилится так?
S>
"bolshik" <29601@users.rsdn.ru> wrote in message news:1783194@news.rsdn.ru... > Здравствуйте, rg45, Вы писали: > > а что означает использование символа 'L' в следующей строке? >
> WideToUTF8(L"Hello", out);
>
Это означает, что каждый символ этого строкового литерала имеет размер два байта (unicode)
Posted via RSDN NNTP Server 1.9
--
Справедливость выше закона. А человечность выше справедливости.
Re[4]: строковый литерал - массив, указатель, шаблон функции
Здравствуйте, rg45, Вы писали:
R>Это означает, что каждый символ этого строкового литерала имеет размер два байта (unicode)
правильно я понимаю, что это относится только к строковым литералам?
Не поделишься ссылкой, где можно почитать, что еще можно применять к строковым литералам?
"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
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: строковый литерал - массив, указатель, шаблон функции
Здравствуйте, Demay, Вы писали:
D>Здравствуйте, _Winnie, Вы писали:
D>Можно явно указать шаблонную функцию: D>
D>WideToUTF8<>(L"hello", s);
D>
В этом-то и фича, что бы явно ничего не указывать. Шаблонная функция здесь выступает в роли хелпера, о которой вообще никто не должен знать по-хорошему. Просто тихо оптимизирует вычисление длины. Ну я так понимаю ситуацию.
Второй момент, что возлагать это на юзера плохо — всё равно ведь не досмотрит — компилятор надёжнее.
Здравствуйте, rg45, Вы писали:
R>Вообще символ L образовался от Long и может применяться не только к строковым литералам. R>Например литерал 123123123123123123L задает 64-разрядную целочисленную знаковую константу. R>п. 2.13 стандарта дает подробное описание всех возможных в С++ литералов. R>В MSDN это тоже есть.
Здравствуйте, _Winnie, Вы писали:
_W>...
_W>Когда я вызываю _W>WideToUTF8(L"hello", s) _W>то вызывается версия которая принимает указатель, а не ссылку на массив. Почему? Как исправить?
Смотри — с такими вещами надо быть осторожно. Если эта функция используется только как ты привёл: WideToUTF8(L"hello", s); то тогда нормально. А если она используется по-разному и разными людьми, то можно получить нехорошую ситуацию:
В выделенной строчке получишь поведение, которое не совсем ожидалось.
У меня была похожая ситуация и я в целях безопасности для входных буферов оставил только сигнатуру с (const char*), а длина всегда считается автоматически. Т.к. использовались эти функции хаотически и разными людьми.
А вот для выходных буферов это действительно очень полезно:
std::string s = "...";
wchar_t buf[4096] = {0};
WideToUTF8(s, buf);
Размер массива в WideToUTF8 можно сразу на 1 уменьшить, что бы не потереть завершающий ноль.
Тут сразу 3 оптимизации: и память динамически не выделяется под выходной буфер и длина выходного буфера не считается и длина входного буфера не считается, т.к. std::string