给定以下向量和函数:
std::vector<int> param;
std::vector<int>& getparam_1() {
return param;
}
std::vector<int> getparam_2() {
return param;
}
我知道以下两个表达式都会被编译:
std::vector<int> param_copy1 = getparam_1();
std::vector<int> param_copy2 = getparam_2();
但它们的区别是什么?
答案 0 :(得分:3)
最明显的区别是如果按引用返回,则可以更改全局变量。
示例
#include <iostream>
#include <vector>
std::vector<int> param{ 1,2,3,4,5 };
std::vector<int>& getparam_1()
{
return param;
}
std::vector<int> getparam_2()
{
return param;
}
int main()
{
getparam_1().push_back(9);
for (const auto& i : param)
{
std::cout << i;
}
}
这将打印“123459”。
#include <iostream>
#include <vector>
std::vector<int> param{ 1,2,3,4,5 };
std::vector<int>& getparam_1()
{
return param;
}
std::vector<int> getparam_2()
{
return param;
}
int main()
{
getparam_2().push_back(9);
for (const auto& i : param)
{
std::cout << i;
}
}
这将打印“12345”。
答案 1 :(得分:2)
但它们的区别是什么?
结果是一样的,所以在这方面没有区别。
从抽象机器的角度来看,在 C++17 之前,两个示例都有一个副本,第二个示例从该副本开始移动。但是移动可以被优化掉,所以仍然没有必然的实际差异。从 C++17 开始,只有一个副本,两种情况下都没有移动。
抽象机器在复制发生的地方略有不同。在第一个示例中,副本位于函数外部,而在第二个示例中,副本位于函数内部。
答案 2 :(得分:1)
按价值返回
该值的副本返回给调用者。
引用返回
对变量的引用被传递回调用者。然后调用者可以使用这个引用来继续修改向量。
如果您在向量中使用 int
,则不必费心按引用返回
它并没有太大的不同。如果您正在使用类或结构,则应考虑使用按引用或指针返回。