какое ключевое слово const необходимо - PullRequest
4 голосов
/ 28 апреля 2011

Мой код не компилируется.

int foobar()
{
    // code
    return 5;
}

int main()
{
   int &p = foobar(); // error
   // code

   const int& x = foobar(); //compiles
}

Почему при добавлении ключевого слова const код компилируется?

Ответы [ 3 ]

9 голосов
/ 28 апреля 2011

В C ++ временные ссылки не могут быть привязаны к непостоянным ссылкам.

In

 int &p = foobar(); 

Выражение rvalue foobar() генерирует временное значение, которое не может быть привязано к p, поскольку это неконстантная ссылка.

 const int &x = foobar();

Добавление временного к x, который является ссылкой на const, продлевает его срок службы.Это совершенно законно.

4 голосов
/ 28 апреля 2011

Потому что foobar() возвращает по значению ;Этот результат является временным.Вы не можете иметь непостоянную ссылку на временную ссылку.

Если бы это было не так, что бы этот код делал?

int &x = foobar();

x = 1;  // Where are we writing to?
2 голосов
/ 28 апреля 2011

Как уже говорили другие, вы можете взять постоянную, но не неконстантную ссылку на временную.

На практике было бы опасно допускать неконстантные ссылки на временные ссылки:

#include <iostream>
void foo(int &i) {
    i = 5;
}

int main() {
    long l = 4;
    foo(l);
    std::cout << l << "\n";
}

Теперь l может быть неявно преобразовано в int, поэтому, если бы здесь была разрешена неконстантная ссылка на временную, то, вероятно, foo будет передана ссылка на результат этого преобразования, так же, как на самом деле, если foo занимает const int &. Назначение будет сделано для временного и затем отброшено, когда временное уничтожено. Это гораздо более вероятная ошибка, чем предполагаемый результат.

Я не знаю, есть ли аккуратный набор правил, разрешающих неконстантные ссылки на временные ссылки в некоторых ситуациях, но не в опасных / раздражающих, но даже в этом случае стандарт C ++ не включал их. Обратите внимание, что в C ++ 0x есть ссылки на rvalue, которые позволяют вам делать некоторые дополнительные вещи с временными файлами, что невозможно сделать в C ++ 03.

...