这复制了矢量吗?

时间:2014-05-23 00:46:13

标签: c++ pointers vector reference

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

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

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

或者我只需要使用:

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

或者,我需要同时做两件事吗?

3 个答案:

答案 0 :(得分:6)

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

总是复制,无论y.getTheVector();的返回类型如何。

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

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

答案 1 :(得分:2)

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

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

  1. getTheVector()的返回值是左值引用。在这种情况下,始终会调用复制构造函数。
  2. getTheVector()的返回值是暂时的。在这种情况下,可以调用移动构造函数,或者编译器可以完全省略移动/复制。
  3. 返回值是右值参考(通常是一个可怕的想法)。在这种情况下,将调用移动构造函数。
  4. 对于这一行,

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

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

答案 2 :(得分:1)

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

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

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

但是,在第二个示例中,您正在创建引用,因此不会复制该向量。