在下面的函数中,我想获取一个 vector objects
并返回该 vector 的一个元素的拷贝。由于下面的代码编译正确,我假设迭代器 copy_objects.back()
被自动取消引用。但我不确定。返回语句中发生了什么?
MyObject best(vector<MyObject>& objects) {
vector<MyObject> copy_objects = objects;
sort(copy_objects.begin(), copy_objects.end(), compare_MyObject_func);
return copy_objects.back();
}
我知道还有其他方法可以完成手头的简单任务,但我很想知道这个示例中发生了什么。
后续问题...
使用上面的 best
函数的定义,我得到以下编译错误:
error: invalid initialization of non-const reference of type ‘std::vector<MyObject>&’ from an rvalue of type ‘std::vector<MyObject>’
bestObject = best(myfunction(objects));
^
相关的类型声明是:
MyObject bestObject;
vector<MyObject> objects;
vector<MyObject> myfunction(vector<MyObject>&);
我的直觉告诉我这个错误与上面的原始问题有关。但是,我不明白问题出在哪里。
最佳答案
“取消引用”通常是指应用一元 *
指向指针或其他迭代器的运算符(如 *p
)。这个术语令人困惑,因为它与 C++ 中的引用类型没有任何关系,因此标准委员会正在转向使用“执行间接”。
无论如何,copy_objects.back()
根本不返回迭代器。它返回对对象的引用(实际引用类型)。您可以看到这一点,因为 std::vector<T>::back
的返回类型是const_reference
这是 const value_type&
的类型定义, 其中value_type
是T
.您永远不会“取消引用”引用。如果你想从一个引用中复制,你只需要像对待一个普通对象一样对待它。
int x = 0;
int& y = x;
int z = y;
在这个例子中,z
将是 x
引用的对象的拷贝和 y
.
除此之外,我建议也只采用值参数(删除 &
):
MyObject best(vector<MyObject> objects) {
sort(objects.begin(), objects.end(), compare_MyObject_func);
return objects.back();
}
你无论如何都要复制它,所以引用它是没有意义的。特别是非 const
引用表明您将修改给定的参数,但您没有这样做。事实上,当 vector
时,引用参数会给您带来更差的性能。可以移动到函数中。引用类型参数永远不会移动。
回答你的扩展问题:
myfunction
按值返回,这意味着它返回的对象是一个临时对象(它是其中任何内容的拷贝)。您不能绑定(bind)非 const
对临时对象的引用(best
的参数)。这是有道理的,因为这样临时对象就会消失(因为它是临时的)并且引用将空无一物。
如果您将参数类型设置为 const
引用,没关系,因为const
引用延长临时对象的生命周期。如果您将参数设置为非引用,也没有问题,因为它会创建临时对象的本地拷贝。
关于C++ 从具有取消引用类型类型的函数返回引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20937611/