A>>как преобразовать std::string в wchar_t*? не в const wchar_t*, а просто wchar_t*? A>тьфу, простите, описался. std::wstring в wchar_t*
wchart* wc = const_cast<wchar_t*>( s.c_str() );
Но будьте осторожны. Нужно хорошо понимать, зачем Вы избавляетесь от const. Он там не просто так.
Если предполагается изменение строки, лучше скопировать std::wstring::copy.
Здравствуйте, akamda1989, Вы писали:
A>Здравствуйте, akamda1989, Вы писали:
A>>как преобразовать std::string в wchar_t*? не в const wchar_t*, а просто wchar_t*?
A>тьфу, простите, описался. std::wstring в wchar_t*
Здравствуйте, akamda1989, Вы писали:
A>как преобразовать std::wstring в wchar_t*? не в const wchar_t*, а просто wchar_t*?
расскажите подробнее как вы собираетесь работать с полученным wchar_t*, потому что от этого зависит, что же вам посоветовать
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, akamda1989, Вы писали:
A>>как преобразовать std::wstring в wchar_t*? не в const wchar_t*, а просто wchar_t*? U>расскажите подробнее как вы собираетесь работать с полученным wchar_t*, потому что от этого зависит, что же вам посоветовать
Да я понял, что натупил) В реультате я копирую wchar_t*. Мне необходимо его возвращать в функции dll.
Спасибо за помощь!
Здравствуйте, enji, Вы писали:
E>Вообще то чревато. Насколько я понимаю С++03 не гарантирует, что строка хранит себя в непрерывном буфере.
предложи реализацию c_str() без этого условияб и я соглашусь, что — чревато.
Здравствуйте, Caracrist, Вы писали:
C>Здравствуйте, enji, Вы писали:
E>>Вообще то чревато. Насколько я понимаю С++03 не гарантирует, что строка хранит себя в непрерывном буфере. C> C>предложи реализацию c_str() без этого условияб и я соглашусь, что — чревато.
Легко. Строка складывается в непрерывный буффер в момент вызова c_str, до этого хранится так, как удобнее для реализации.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Ops, Вы писали:
Ops>Легко. Строка складывается в непрерывный буффер в момент вызова c_str, до этого хранится так, как удобнее для реализации.
То есть, в многопоточной среде это уже работать не будет? Стандарт разве не требует неизменности состояния объекта при вызове константной функции?
Здравствуйте, Caracrist, Вы писали:
C>То есть, в многопоточной среде это уже работать не будет?
не обязано (многопоточности нет в C++03)
C>Стандарт разве не требует неизменности состояния объекта при вызове константной функции?
нет
в общем, в прикладных вопросах этот момент не очень полезно обсуждать: главные компиляторы хранят строку в непрерывном массиве, а свежий стандарт это даже заставляет делать
гораздо полезнее обсуждать запись по полученному указателю, ведь std::string не подкрутит size() при изменении строки
C>учти, что получить wchar_t* из пустой строки невозможно.
Может, в данном случае действительно лучше послушать стандарт и людей, которые верно подметили про изменение данных не методами этого объекта, а не надеяться на то, что "я бы сделал реализацию непрерывной"?
C>учти, что получить wchar_t* из пустой строки невозможно.
Получить-то можно, &str[0] будет указывать на завершающий нулевой символ. Только вот попытка записи по этому указателю (даже если новое значение совпадает со старым — т.е. является ноликом) приведёт к undefined behavior.
Здравствуйте, Masterkent, Вы писали:
C>>учти, что получить wchar_t* из пустой строки невозможно.
M>Получить-то можно, &str[0] будет указывать на завершающий нулевой символ. Только вот попытка записи по этому указателю (даже если новое значение совпадает со старым — т.е. является ноликом) приведёт к undefined behavior.
К UB приведёт уже взятие str[0], и MS’овская реализация стандартной библиотеки тут выкинет внутренний ассёрт.
Centaur:
M>>Получить-то можно, &str[0] будет указывать на завершающий нулевой символ. Только вот попытка записи по этому указателю (даже если новое значение совпадает со старым — т.е. является ноликом) приведёт к undefined behavior.
C>К UB приведёт уже взятие str[0]
В рамках C++03 в случае с неконстантной str будет undefined behavior, в рамках C++11 использование такого выражения для пустой строки вполне законно.
C>MS’овская реализация стандартной библиотеки тут выкинет внутренний ассёрт.
Здравствуйте, Masterkent, Вы писали:
M>В рамках C++03 в случае с неконстантной str будет undefined behavior, в рамках C++11 использование такого выражения для пустой строки вполне законно.
а можно подробнее осветить этот момент? что будет подставлено в str[0] ? неужели разрешили обращаться за пределы строки?
uzhas:
M>>В рамках C++03 в случае с неконстантной str будет undefined behavior, в рамках C++11 использование такого выражения для пустой строки вполне законно. U>а можно подробнее осветить этот момент? что будет подставлено в str[0] ? неужели разрешили обращаться за пределы строки?
C++03:
21.3.4 basic_string element access [lib.string.access]
1 Requires: pos <= size().
2 Returns: *(begin() + pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified.
1 Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].
В N3337 формулировку 21.4.5/2 сделали более понятной:
Returns: *(begin() + pos) if pos < size(). Otherwise, returns a reference to an object of type charT with value charT(), where modifying the object leads to undefined behavior.