Назначение указателя std::wstring C++

Я пытаюсь присвоить значение указателю wstring, и значение не назначается; однако, когда я разбиваю создание и назначение указателя на две строки, это работает. Почему это?

Например:

std::wstring* myString = &(L"my basic sentence" + some_wstring_var + L"\r\n");

Выше не работает, но ниже работает:

std::wstring temp = (L"my basic sentence" + some_wstring_var + L"\r\n");
std::wstring* myString = &temp;

3 ответа

Решение

В первом примере вы получаете временный адрес. После того, как эта строка выполнила wstring назначенный вами объект myString к больше не доступен (это так называемые rvalueс кстати). Я думаю, должно быть очевидно, что во втором примере у вас есть реальный объект (lvalue который действителен, пока он не выходит за рамки.

Чтобы преодолеть это ограничение с помощью области, вы можете напрямую создать wstring в куче, это может лучше подходить вашей ситуации, но без дополнительной информации трудно сказать:

std::wstring* myString = new std::wstring(L"my basic sentence" + some_wstring_var + L"\r\n");

Недавно созданный wstring Будет ли я инициализирован с содержимым временного значения. Только не забудьте уничтожить указатель после того, как с ним покончено.

С C++11 все усложняется, поэтому временные данные можно использовать чаще по соображениям производительности. Но эта тема очень хотя и будет превышать этот вопрос. Я просто хотел упомянуть об этом, потому что это может вас заинтересовать. Для действительно хорошего объяснения взгляните на этот SO вопрос: что такое семантика перемещения?

std::wstring* myString = &(L"my basic sentence" + some_wstring_var + L"\r\n");

Он указывает на временный объект, время его жизни заканчивается точкой с запятой, поэтому разыменование указателя и его использование - неопределенное поведение.

std::wstring temp = (L"my basic sentence" + some_wstring_var + L"\r\n");
std::wstring* myString = &temp;

Он указывает на временный объект, но время жизни длиннее, и разыменование оно действует, пока существует этот временный объект.

Конечно, вы не можете присвоить адрес (это и есть &) строковой константы переменной. Вы думали об этом? Куда будет указывать указатель?

Другие вопросы по тегам