我有这些功能:
vector<int> foo1() {
vector<int> v;
return v;
}
void foo2( vector<int>& parameter ) {
// Do something
}
void foo3( vector<int> par ) {
foo2( par );
}
...
foo2(foo1()); // Doesn't work (1)
foo3(foo1()); // Works (2)
有没有办法保持函数foo2不变,因为它是将向量作为参数传递的最佳方式,并且可能使其超载以使(1)工作?或者有更好的方法吗?
答案 0 :(得分:2)
通过引用传递通常用于'out parameters',用于将值返回给调用者的参数:
void bar(int &i, int &j);
int i, j;
bar(i, j); // sets i and j
// use i and j values here
C ++碰巧禁止将临时绑定绑定到非常量左值。所以这不起作用:
bar(1,2);
但是,需要允许传递临时值而不复制它们,在C ++ 11之前,通过允许临时值绑定到 const 左值引用来填充这个需求。这是一个特殊规则,它仍然可以防止错误地使用临时作为out参数,但允许避免复制。
由于您使用向量作为输入参数而不是输出参数,因此这是避免复制的适当方法:
void foo2(vector<int> const ¶meter) {
// Do something
}
如果“做某事”代码确实最终复制了该向量,那么你最好这样做:
void foo2(vector<int> parameter) {
// Do something
}
因为这允许编译器在调用foo2
的特定情况下为您优化复制,可能会删除副本。