我正在查看一些代码,并且返回字符串的函数的所有调用都被分配给引用。函数原型类似于:
std::string GetPath(const std::string& top);
它用作
std::string& f = GetPath(cw);
或
const std::string& f = GetPath(cw);
为什么会在这里使用引用而不是
std::string f = GetPath(cw);
答案 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)