我正在尝试为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;
答案 0 :(得分:7)
在第一个示例中,您将获得临时地址。在该行执行之后,您分配给wstring
的{{1}}对象不再可用(顺便说一下,这些被称为myString
。我认为很明显,在第二个例子中你有一个真实的对象(rvalue
只要它没有运行范围就有效。
要使用范围克服此限制,您可以直接在堆上创建lvalue
,这可能更适合您的情况,但没有进一步的信息,这很难说:
wstring
我将使用临时右值的内容初始化新创建的std::wstring* myString = new std::wstring(L"my basic sentence" + some_wstring_var + L"\r\n");
。
完成后,不要忘记销毁指针。
使用C ++ 11时,事情变得复杂,因此出于性能原因,临时工具可以更频繁地重复使用。但是这个话题非常多,而且会超出这个问题。我只是想提一下,因为它可能会让你感到厌烦。要获得一个非常好的解释,请看一下这个问题:What are move semantics?
答案 1 :(得分:1)
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;
它指向一个临时对象,但是生命时间更长,并且在该临时对象存在时取消它是有效的。
答案 2 :(得分:0)
当然,您无法将字符串常量的地址(& is& is)分配给变量。你有没有想过这个?指针指向哪里?