如果我有以下代码,是否复制了矢量?
std::vector<int> x = y.getTheVector();
或者它取决于getTheVector()
的返回类型是否通过引用?
或者我只需要使用:
std::vector<int>& x = y.getTheVector();
或者,我需要同时做两件事吗?
答案 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();
这是复制初始化。有三种可能的情况:
getTheVector()
的返回值是左值引用。在这种情况下,始终会调用复制构造函数。getTheVector()
的返回值是暂时的。在这种情况下,可以调用移动构造函数,或者编译器可以完全省略移动/复制。对于这一行,
std::vector<int>& x = y.getTheVector();
这仅在getTheVector
返回左值引用时编译;临时不能绑定非const左值引用。在这种情况下,不会复制;但终身问题可能很棘手。
答案 2 :(得分:1)
std::vector<int> x = y.getTheVector();
无论“getTheVector”函数是否返回向量或对向量的引用,您的第一个示例确实会复制向量。
std::vector<int>& x = y.getTheVector();
但是,在第二个示例中,您正在创建引用,因此不会复制该向量。