std::string в wchar_t*
От: akamda1989  
Дата: 27.03.12 08:48
Оценка:
как преобразовать std::string в wchar_t*? не в const wchar_t*, а просто wchar_t*?
Re: std::string в wchar_t*
От: akamda1989  
Дата: 27.03.12 08:49
Оценка:
Здравствуйте, akamda1989, Вы писали:

A>как преобразовать std::string в wchar_t*? не в const wchar_t*, а просто wchar_t*?


тьфу, простите, описался. std::wstring в wchar_t*
Re[2]: std::string в wchar_t*
От: Caracrist https://1pwd.org/
Дата: 27.03.12 08:53
Оценка:
Здравствуйте, akamda1989, Вы писали:

A>тьфу, простите, описался. std::wstring в wchar_t*


std::wstring str = L"something";
assert(!str.empty());
wchar_t* buffer = &str[0];

учти, что получить wchar_t* из пустой строки невозможно.
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: std::string в wchar_t*
От: pugv Россия  
Дата: 27.03.12 08:53
Оценка:
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.
Re[2]: std::string в wchar_t*
От: milkpot Россия  
Дата: 27.03.12 09:04
Оценка:
Здравствуйте, akamda1989, Вы писали:

A>Здравствуйте, akamda1989, Вы писали:


A>>как преобразовать std::string в wchar_t*? не в const wchar_t*, а просто wchar_t*?


A>тьфу, простите, описался. std::wstring в wchar_t*


MSDN.
Re: std::string в wchar_t*
От: uzhas Ниоткуда  
Дата: 27.03.12 09:12
Оценка:
Здравствуйте, akamda1989, Вы писали:

A>как преобразовать std::wstring в wchar_t*? не в const wchar_t*, а просто wchar_t*?

расскажите подробнее как вы собираетесь работать с полученным wchar_t*, потому что от этого зависит, что же вам посоветовать
Re[2]: std::string в wchar_t*
От: akamda1989  
Дата: 27.03.12 10:39
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, akamda1989, Вы писали:


A>>как преобразовать std::wstring в wchar_t*? не в const wchar_t*, а просто wchar_t*?

U>расскажите подробнее как вы собираетесь работать с полученным wchar_t*, потому что от этого зависит, что же вам посоветовать

Да я понял, что натупил) В реультате я копирую wchar_t*. Мне необходимо его возвращать в функции dll.
Спасибо за помощь!
Re[3]: std::string в wchar_t*
От: enji  
Дата: 27.03.12 13:01
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>
C>wchar_t* buffer = &str[0];
C>


Вообще то чревато. Насколько я понимаю С++03 не гарантирует, что строка хранит себя в непрерывном буфере.
Re[4]: std::string в wchar_t*
От: Caracrist https://1pwd.org/
Дата: 27.03.12 16:11
Оценка: -1
Здравствуйте, enji, Вы писали:

E>Вообще то чревато. Насколько я понимаю С++03 не гарантирует, что строка хранит себя в непрерывном буфере.


предложи реализацию c_str() без этого условияб и я соглашусь, что — чревато.
~~~~~
~lol~~
~~~ Single Password Solution
Re[5]: std::string в wchar_t*
От: Ops Россия  
Дата: 27.03.12 18:39
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, enji, Вы писали:


E>>Вообще то чревато. Насколько я понимаю С++03 не гарантирует, что строка хранит себя в непрерывном буфере.

C>
C>предложи реализацию c_str() без этого условияб и я соглашусь, что — чревато.

Легко. Строка складывается в непрерывный буффер в момент вызова c_str, до этого хранится так, как удобнее для реализации.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[6]: std::string в wchar_t*
От: Caracrist https://1pwd.org/
Дата: 27.03.12 18:53
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Легко. Строка складывается в непрерывный буффер в момент вызова c_str, до этого хранится так, как удобнее для реализации.


То есть, в многопоточной среде это уже работать не будет? Стандарт разве не требует неизменности состояния объекта при вызове константной функции?
~~~~~
~lol~~
~~~ Single Password Solution
Re[7]: std::string в wchar_t*
От: uzhas Ниоткуда  
Дата: 27.03.12 18:59
Оценка: 3 (1)
Здравствуйте, Caracrist, Вы писали:

C>То есть, в многопоточной среде это уже работать не будет?

не обязано (многопоточности нет в C++03)

C>Стандарт разве не требует неизменности состояния объекта при вызове константной функции?

нет

в общем, в прикладных вопросах этот момент не очень полезно обсуждать: главные компиляторы хранят строку в непрерывном массиве, а свежий стандарт это даже заставляет делать
гораздо полезнее обсуждать запись по полученному указателю, ведь std::string не подкрутит size() при изменении строки
Re[3]: std::string в wchar_t*
От: DarkTranquillity  
Дата: 28.03.12 05:53
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, akamda1989, Вы писали:


A>>тьфу, простите, описался. std::wstring в wchar_t*


C>
C>std::wstring str = L"something";
C>assert(!str.empty());
C>wchar_t* buffer = &str[0];
C>

C>учти, что получить wchar_t* из пустой строки невозможно.

Может, в данном случае действительно лучше послушать стандарт и людей, которые верно подметили про изменение данных не методами этого объекта, а не надеяться на то, что "я бы сделал реализацию непрерывной"?
Re[3]: std::string в wchar_t*
От: MasterZiv СССР  
Дата: 28.03.12 09:48
Оценка:
> Да я понял, что натупил) В реультате я копирую wchar_t*. Мне необходимо его
> возвращать в функции dll.

Как ? Пример, код.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: std::string в wchar_t*
От: Masterkent  
Дата: 28.03.12 20:57
Оценка:
Caracrist:

C>
C>std::wstring str = L"something";
C>assert(!str.empty());
C>wchar_t* buffer = &str[0];
C>

C>учти, что получить wchar_t* из пустой строки невозможно.

Получить-то можно, &str[0] будет указывать на завершающий нулевой символ. Только вот попытка записи по этому указателю (даже если новое значение совпадает со старым — т.е. является ноликом) приведёт к undefined behavior.
Re[4]: std::string в wchar_t*
От: Caracrist https://1pwd.org/
Дата: 29.03.12 21:29
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>Получить-то можно, &str[0] будет указывать на завершающий нулевой символ.


Удачи!
~~~~~
~lol~~
~~~ Single Password Solution
Re[4]: std::string в wchar_t*
От: Centaur Россия  
Дата: 30.03.12 06:49
Оценка:
Здравствуйте, Masterkent, Вы писали:

C>>учти, что получить wchar_t* из пустой строки невозможно.


M>Получить-то можно, &str[0] будет указывать на завершающий нулевой символ. Только вот попытка записи по этому указателю (даже если новое значение совпадает со старым — т.е. является ноликом) приведёт к undefined behavior.


К UB приведёт уже взятие str[0], и MS’овская реализация стандартной библиотеки тут выкинет внутренний ассёрт.
Re[5]: std::string в wchar_t*
От: Masterkent  
Дата: 30.03.12 08:37
Оценка:
Centaur:

M>>Получить-то можно, &str[0] будет указывать на завершающий нулевой символ. Только вот попытка записи по этому указателю (даже если новое значение совпадает со старым — т.е. является ноликом) приведёт к undefined behavior.


C>К UB приведёт уже взятие str[0]


В рамках C++03 в случае с неконстантной str будет undefined behavior, в рамках C++11 использование такого выражения для пустой строки вполне законно.

C>MS’овская реализация стандартной библиотеки тут выкинет внутренний ассёрт.


Рухлядь старая, что тут ещё скажешь...
Re[6]: std::string в wchar_t*
От: uzhas Ниоткуда  
Дата: 30.03.12 08:57
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>В рамках C++03 в случае с неконстантной str будет undefined behavior, в рамках C++11 использование такого выражения для пустой строки вполне законно.

а можно подробнее осветить этот момент? что будет подставлено в str[0] ? неужели разрешили обращаться за пределы строки?
Re[7]: std::string в wchar_t*
От: Masterkent  
Дата: 30.03.12 09:40
Оценка: 6 (1)
uzhas:

M>>В рамках C++03 в случае с неконстантной str будет undefined behavior, в рамках C++11 использование такого выражения для пустой строки вполне законно.

U>а можно подробнее осветить этот момент? что будет подставлено в str[0] ? неужели разрешили обращаться за пределы строки?

C++03:

21.3.4 basic_string element access [lib.string.access]

const_reference operator[](size_type pos) const;
reference operator[](size_type pos);

1 Returns: If pos < size(), returns data()[pos]. Otherwise, if pos == size(), the const version returns charT(). Otherwise, the behavior is undefined.

C++11:

21.4.5 basic_string element access [string.access]

const_reference operator[](size_type pos) const;
reference operator[](size_type pos);

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.

21.4.7.1 basic_string accessors [string.accessors]

const charT* c_str() const noexcept;
const charT* data() const noexcept;

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.

Re[8]: std::string в wchar_t*
От: uzhas Ниоткуда  
Дата: 30.03.12 09:58
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>C++11:

мда, имхо в C++03 было лучше =\
ну да ладно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.