【问题标题】:Does this copy the vector?这会复制向量吗?
【发布时间】:2014-05-23 00:46:13
【问题描述】:

如果我有以下代码,是否复制了向量?

std::vector<int> x = y.getTheVector();

还是取决于getTheVector() 的返回类型是否通过引用?

或者我只需要使用:

std::vector<int>& x = y.getTheVector();

或者,我需要两者都做吗?

【问题讨论】:

  • 如果 x 是引用,则不复制,如果不是,则复制。
  • 我不同意 awesomeyi。 getTheVector 函数的返回无关紧要;重要的是你分配给它的东西。
  • 好的,我同意@awesomeyi 编辑的答案,这取决于x 的类型,而不是getTheVector 函数的返回类型。
  • 如果 getTheVector 返回的不是临时的引用,那么第二行就有很大的问题。
  • 这是非常有趣的家伙 - 所以函数返回类型不能确定传递机制?它是调用方对象的类型(在这种情况下 x 是否是引用)!?

标签: c++ pointers vector reference


【解决方案1】:
std::vector<int> x = y.getTheVector();

无论y.getTheVector(); 的返回类型如何,始终进行复制。

std::vector<int>& x = y.getTheVector();

不会复制。但是,只要y.getTheVector() 返回对在函数返回后将有效的对象的引用,x 就会有效。如果y.getTheVector()返回一个在函数中创建的对象,x将指向一个在语句之后不再有效的对象。

【讨论】:

  • 在 C++11 中,第一行将导致移动而不是复制,除非返回类型是引用。
  • @Aberrant 编译器将省略副本。它甚至不会采取行动。
  • @Aberrant,return value optimization 也不是 C++11 的发明,尽管任何 C++11 编译器都可以执行 RVO。并且可能存在编译器无法进行优化的情况。
【解决方案2】:
std::vector<int> x = y.getTheVector();

这是复制初始化。有三种可能的情况:

  1. getTheVector() 的返回值是一个左值引用。在这种情况下,始终会调用复制构造函数。
  2. getTheVector() 的返回值是临时的。在这种情况下,可能会调用移动构造函数,或者移动/复制可能会被编译器完全忽略。
  3. 返回值是一个右值引用(通常是一个糟糕的想法)。在这种情况下,将调用移动构造函数。

对于这一行,

 std::vector<int>& x = y.getTheVector();

这仅在getTheVector 返回左值引用时编译;临时不能绑定非常量左值引用。在这种情况下,永远不会复制;但寿命问题可能很棘手。

【讨论】:

    【解决方案3】:
    std::vector<int> x = y.getTheVector();
    

    您的第一个示例确实复制了向量,无论“getTheVector”函数是返回向量还是对向量的引用。

    std::vector<int>& x = y.getTheVector();
    

    然而,在您的第二个示例中,您正在创建一个引用,因此不会复制向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 2020-10-06
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      相关资源
      最近更新 更多