Использование константной ссылки на возвращаемое значение - PullRequest
4 голосов
/ 24 мая 2011

Посмотрите на следующий пример:

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, но я подумал, что для этого мне нужно написать строку следующим образом:

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

Обе версии, кажется, работают, и я считаю, с одинаковой производительностью.Безопасно ли использовать первую версию (с ссылкой на const)?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 24 мая 2011

Назначение временной константной ссылки совершенно правильно.Временный объект будет жить, пока ссылка не выйдет из области видимости.

Хотя в вашем примере это не имеет смысла, эта функция часто используется для аргументов функции:

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));
}
3 голосов
/ 24 мая 2011

Это безопасно в этом простом случае. Однако легко добавить код, который делает его небезопасным, и это сбивает с толку любого, кто знает C ++: зачем вам здесь ссылка? Нет причин делать это, и такого кода, как правило, следует избегать.

2 голосов
/ 24 мая 2011

Безопасно ли использовать первую версию (со ссылкой на const)?

Да.Привязка временного объекта к константной ссылке удлиняет время жизни временного объекта до времени жизни самой ссылки, что является областью, в которой объявляется ссылка:

void f()
{
   const string& a = foo(10);

   //some work with a

   {
     const string& b = foo(20);

     //some work with b

   } //<----- b gets destroyed here, so the temporary also gets destroyed!

   //some more work with a

} //<----- a gets destroyed here, so the temporary associated 
                                  //with it also gets destroyed!

Херб Саттер подробно объяснил этоего статья:

Кандидат на «Самое важное»

Это стоит прочитать.Надо прочитать.

2 голосов
/ 24 мая 2011

Const-ссылка может привязываться к временному объекту, а время существования временного объекта будет продлено до времени существования const-ссылки. Так что да, это безопасно для использования.

...