C++ 从具有取消引用类型类型的函数返回引用?

标签 c++ reference iterator return

在下面的函数中,我想获取一个 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_typeT .您永远不会“取消引用”引用。如果你想从一个引用中复制,你只需要像对待一个普通对象一样对待它。

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/

相关文章:

java - 使用 ArrayList 的迭代器时出现 ArrayIndexOutOfBoundsException

c++ - CRT 语言环境临界区死锁

c++,我可以使用 enable_if 而不是复制粘贴来启用多个特征类特化吗?

c++ - 为什么 const char* const & = "hello"可以编译?

c++ - 用于 C++ 的 mxnet ndarray 迭代器

c++ - 使用 std::string 迭代器查找它的字符串的开始和结束

c++ - x,y,z 到 vector 偏移

c++ - 如何将工具链交叉编译到 ARMv5 平台?

c - 指针和引用之间的真正区别是什么?

excel - 即使在 Excel 2007 中插入行时也保持绝对引用