假设我有一个函数:
Foo GetFoo(..)
{
...
}
假设我们不知道这个函数如何实现,也不知道Foo的内部结构(它可以是非常复杂的对象)。但是我们知道函数返回值为Foo,并且我们希望将此返回值用作const。
问题:将此函数的返回值存储为const &
总是一个好主意吗?
答案:这取决于函数返回值的大小和复杂程度。对于小而简单的对象,按值返回并将其存储为const可能是更好的选择。对于大型或复杂的对象,使用const &
可能更有效,以避免不必要的拷贝和对象的创建/销毁。但是,应该意识到使用引用会增加代码的复杂性,并可能导致悬空引用的问题。因此,请根据具体情况进行决策。
const Foo& f = GetFoo(...);
与其...不如...
const Foo f = GetFoo(...);
我知道编译器会执行返回值优化,可能会移动对象而不是复制它们,因此最终const&
可能没有任何优势。但我的问题是,是否存在缺点?为什么我不应该养成肌肉记忆,始终使用const&
存储返回值,既不必依赖于编译器优化,也不必担心即使移动操作对于复杂对象来说也可能很昂贵。
将这个问题推到极致,为什么我不应该在我的代码中对所有不可变变量始终使用const&
?例如:
const int& a = 2;
const int& b = 2;
const int& c = c + d;
除了更冗长之外,还有什么缺点吗?
int
)的引用保留下来可能比使用一个int
变量更低效。 - Mark Ransomdecltype(auto)
在C++14中是否是可行的替代方案? - John McFarlaneconst … &…=…;
的动机,因此我们不需要问这个问题,可以使用引用来表达身份重要性的语义。 - Davis Herring