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.

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.