【问题标题】:Return a vector as parameter返回一个向量作为参数
【发布时间】:2012-10-26 21:20:54
【问题描述】:

我有这些功能:

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) 工作?或者有更好的方法吗?

【问题讨论】:

  • 您不能将非常量引用绑定到临时引用。无论如何,如果函数调用的临时返回值刚刚被销毁,那么修改它的意义何在?
  • @Sval 从不按值传递向量。这是非常不理想的。
  • @satuon,除非你无论如何都需要复制它。
  • 如果不需要修改vector的内容,foo2应该把它当成const vector&lt;int&gt;&amp;。那么临时通过就没有问题了。
  • @Svalorzen:看看这个cpp-next.com/archive/2009/08/want-speed-pass-by-value,那是没有move-semanticsC++03

标签: c++ vector reference


【解决方案1】:

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

void bar(int &i, int &j);

int i, j;
bar(i, j); // sets i and j
// use i and j values here

C++ 碰巧不允许将临时变量绑定到非 const 左值。所以这不起作用:

bar(1,2);

但是,需要允许在不复制临时变量的情况下传递它们,在 C++11 之前,通过允许临时变量绑定到 const 左值引用来满足这一需求。这是一个特殊规则,它仍然可以防止错误地将临时值用作输出参数,但可以避免复制。

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

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

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

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

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

【讨论】:

  • 我已经尝试将 const 放在 vector 之后,但它不起作用(我现在再次尝试,它仍然不起作用)。如果我将 const 放在它之前,程序会编译。
  • @Svalorzen vector&lt;int&gt; const &amp;const vector&lt;int&gt; &amp; 是相同的类型。我只是更喜欢将const 放在后面。如果还有其他问题,那是因为您没有描述问题的某些方面,因为这个works fine
  • 我想我在这里和那里忘记了一些 const,并将 const 放在它之前会使编译器以某种方式忽略它们。现在它可以双向工作了,谢谢!我会尽快接受。
猜你喜欢
  • 1970-01-01
  • 2014-12-16
  • 2021-07-20
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2012-08-31
  • 2022-08-05
  • 1970-01-01
相关资源
最近更新 更多