Да, в первом примере wstring, созданная вызовом std :: to_wstring, имеет только область видимости. После выполнения строки она выходит за пределы области действия, и ее значение сомнительно.
Во втором примере wstring по-прежнему находится в области действия и действителен, и поэтому работает вызов .c_str().
Нет, другой ответ неверен. Посмотрите на реализацию c_str()
. c_str()
возвращает в основном LPCWSTR
... назовите его const WCHAR*
или const wchar_t*
или что угодно. Однако возврат c_str()
относится к внутреннему указателю wstring. Проблема в том, что после выполнения строки кода wstring, возвращаемый с to_wstring()
, недействителен, поэтому указатель, возвращаемый c_str()
, является мусором. Для удовольствия, попробуйте следующий код:
//cstr_.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv)
{
auto temp = to_wstring(1).c_str();
wprintf(L"%s\n", temp);
auto temp2 = to_wstring(1);
wprintf(L"%s\n", temp2.c_str());
wstring ws = to_wstring(1);
auto temp3 = ws.c_str();
wprintf(L"%s\n", temp3);
}
я скомпилированный выше из оболочки строки VC++ с: cl.exe cstr.cpp
Если другой ответ правильный, то последняя строка должна иметь мусор или ничего не выводится, потому что, согласно другому ответу, c_str() является темпом. Но, если мой ответ правильный, то он должен вывести 1 (что он делает). Если все остальное не удается, посмотрите исходный код реализации.
Возможный дубликат [std :: string :: c \ _str() и временные] (http://stackoverflow.com/questions/10006891/stdstringc-str-and-temporaries) – IInspectable