为什么要为引用分配返回值?

时间:2011-01-13 20:02:47

标签: c++

我正在查看一些代码,并且返回字符串的函数的所有调用都被分配给引用。函数原型类似于:

 std::string GetPath(const std::string& top);

它用作

std::string& f = GetPath(cw);

 const std::string& f = GetPath(cw);

为什么会在这里使用引用而不是

 std::string f = GetPath(cw);

3 个答案:

答案 0 :(得分:22)

如果该函数返回了引用(它没有),那么您可能希望将返回值分配给引用以保持“最新” “对该对象进行任何更改。返回的引用必须是一个生命周期超出函数末尾的对象。

或者(如果返回的引用不是 - const),因为您希望保留对该对象的引用以将其变为后续点。 (如果你想立即改变它,你可以直接改变它,不需要存储引用。)

当函数返回一个值时,您可以将其分配给const引用(对于非const引用将是非法的)并将对象的生命周期延长到引用的生命周期。但是,效果与直接在对象中存储值完全相同(const除外)。

任何认为可能效率较低的人都可能证明没有根据,如果你愿意的话,你可以使用const来限定对象。 (大多数编译器消除了隐含的临时值,并在正在初始化的对象中构造返回值。)

由于函数按值返回对象类型,因此它必须是可复制的,因此不必使用引用,因为担心它不是。

答案 1 :(得分:2)

这可能是一种过于热心的优化,旨在调用函数返回引用的情况,如:

const std::string& func();
...
const std::string& tmp = func();
...

保存字符串副本。

答案 2 :(得分:-4)

好吧,这完全没有意义。看起来很糟糕。而不是有效的c ++。只是这样做。

编辑:,以便更好地理解我的意思

reference & var = funcNotReturningReference(); //invalid C++
const reference & cvar = funcNotReturningReference(); //silly C++, no saving costs (reference to temporary stops temporary from being released, but this code does not help anything)