0

我有这些功能:

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)工作?还是有更好的方法来做到这一点?

4

1 回答 1

2

通过引用传递通常用于“输出参数”,用于向调用者返回值的参数:

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左值引用来满足这一需求。这是一个特殊规则,它仍然可以防止错误地使用临时参数作为输出参数,但可以避免复制。

由于您使用向量作为输入参数而不是输出参数,这将是避免复制的适当方法:

void foo2(vector<int> const &parameter) {
    // Do something
}

如果“做某事”代码最终确实复制了向量,那么最好这样做:

void foo2(vector<int> parameter) {
    // Do something
}

因为这允许编译器在调用的特定情况下为您优化复制foo2,也许会消除复制。

于 2012-10-26T21:40:19.017 回答