我的问题是关于C ++中的临时变量以及如何最好地避免它们的陷阱。
有些情况下我们会做类似以下的事情:
SomeFunctionReturningStdString().c_str();
其中SomeFunctionReturningStdString()
按值返回std::string
。
然而,我们发现这导致了未定义的行为,并提出了两个解决此问题的建议:
std::string temp = SomeFunctionReturningStdString();
temp.c_str();
..类似于此link中指定的解决方案。
或让SomeFunctionReturningStdString()
通过引用返回std::string
。这样,如果我的理解是正确的,那么永远不应该创建一个临时对象,因为我们现在有了对该对象的引用。
两种解决方案都有效吗?他们能否避免与临时变量相关的陷阱?
答案 0 :(得分:1)
两种解决方案都有效吗?
第一个是有效的。
如果在SomeFunctionReturningStdString()
返回后返回引用的对象仍处于活动状态,则第二个将有效。如果不查看SomeFunctionReturningStdString()
中的代码以及如何定义它返回引用的对象,就不可能判断这是否正确。
除非存在性能问题,否则最好使用第一个解决方案。理解和维护会更容易。
答案 1 :(得分:0)
如果您收到了返回的值,只要它在使用它的单个表达式中生存,它就会生存。为了保存它,您必须创建某种类型的变量,至少具有直接封闭块的范围来存储它并将值赋给该变量。我希望这是有道理的。