2017-06-15 112 views
0

我的问题是关于C++中的临时变量以及如何最好地避免它们的陷阱。C++临时变量的生存期

在有些情况下,我们做类似下面的内容实例:

SomeFunctionReturningStdString().c_str(); 

其中SomeFunctionReturningStdString()按值返回std::string

我们已经发现,但是这会导致不确定的行为,并提出了两个建议,以解决此问题:

std::string temp = SomeFunctionReturningStdString(); 
temp.c_str(); 

..similar在此link指定的解决方案。

或使SomeFunctionReturningStdString()通过引用返回std::string。这样,如果我的理解是正确的,那么就不会创建一个临时对象,因为我们现在有了对该对象的引用。

这两个解决方案是否有效?他们都可以避免与临时变量相关的陷阱吗?

+2

不幸的是,你的例子被简化为不再相关。是的,这里有一个暂时的,但它足够长(完整的表达),所以'c_str'调用本身是有效的。返回的'char const *'指针在临时字符串的同一时刻(final';')过期。 – MSalters

回答

0

这两种解决方案都有效吗?

第一个是有效的。

如果返回引用的对象在SomeFunctionReturningStdString()返回后仍然存在,则第二个有效。如果没有查看SomeFunctionReturningStdString()中的代码以及它返回引用的对象是如何定义的,则无法判断这是否为真。

除非存在性能问题,否则最好使用第一种解决方案。这将更容易理解和维护。

+0

谢谢。是的,我应该更加明确地提到SomeFunctionReturningStdString()确实会返回一个有效的引用。 – user3527596

0

如果您收到一个返回的值,只要它在使用它的单个表达式中就会生存下来。为了保存它,你必须创建一些类型的变量,它至少有立即封闭块的范围来存储它,并赋值给该变量。我希望这是有道理的。