4

看下面的例子:

string foo(int i) {
  string a;
  ... Process i to build a ...
  return a;
}

void bar(int j) {
  const string& b = foo(j);
  cout << b;
}

我知道 RVO 和 NRVO,但我认为为了做到这一点,我需要编写 bar 如下:

void bar(int j) {
  string b = foo(j);
  cout << b;
}

两个版本似乎都有效,我相信具有相同的性能。使用第一个版本(带有 const 参考)是否安全?

谢谢。

4

4 回答 4

7

将临时分配给 const 引用是完全有效的。临时对象将一直存在,直到引用超出范围。

虽然在您的示例中没有意义,但此功能通常用于函数参数:

string foo(int i) {
    string a;
    // ...
    return a;
}

void bar(const string& str) {
    // ...
}

void buzz() {
    // We can safely call bar() with the temporary string returned by foo():
    bar(foo(42));
}
于 2011-05-24T08:21:40.650 回答
3

在这种简单的情况下是安全的。然而,添加使其不安全的代码很容易,而且任何了解 C++ 的人都会感到困惑:为什么在这里需要参考?没有理由这样做,并且通常应避免使用此类代码。

于 2011-05-24T08:13:36.947 回答
2

允许 const-reference 绑定到临时,并且临时的 live-time 将延长到 const-reference 的 live-time。所以是的,它可以安全使用。

于 2011-05-24T08:15:43.127 回答
2
于 2011-05-24T08:45:07.573 回答