Назначение указателя 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;
Он указывает на временный объект, но время жизни длиннее, и разыменование оно действует, пока существует этот временный объект.
Конечно, вы не можете присвоить адрес (это и есть &) строковой константы переменной. Вы думали об этом? Куда будет указывать указатель?