请考虑以下代码段:
list<someClass>& method();
....
list<someClass> test = method();
这会是什么行为?请问这段代码:
返回对method()返回值优化返回的someClass实例的引用,然后对引用执行someClass的复制构造函数?
避免以某种方式调用复制构造函数?
具体来说,我有返回非常大的列表的方法,我想避免在每个返回值上调用复制构造函数。
编辑:呃,对不起,代码现在编译......答案 0 :(得分:4)
必须调用复制构造函数,因为此代码必须复制:method()
函数返回对某个对象的引用,其副本必须存储在变量test
中。
由于您要返回引用而不是对象,因此不需要返回值优化。
如果您不想复制该列表,可以将test
作为参考:
list<someClass>& test = method();
但是,test
将引用原始列表,因此对test
所做的任何修改也将对原始列表进行,并且每当原始列表被销毁时,test
将变为无效(这意味着您必须更加小心对象生命周期)。
答案 1 :(得分:1)
存在RVO。我不确定它是否适用于此。无论如何,这是最小化复制的一种方法。
答案 2 :(得分:0)
好吧,你不能为someClass分配一个列表(除非你重载了赋值运算符或复制构造函数,并使用返回的列表来复制构造)。如果你不这样做就不应该编译。
答案 3 :(得分:0)
查看您的代码,通过将引用返回到列表然后复制它,很难猜测您要在此处实现的目标。
如果可能的话,请考虑将迭代器返回到列表(或对迭代器的引用)的想法(假设列表不是函数本地的东西等)。