КИТА unofficial

Ваши интересы => Викторины и конкурсы => Тема начата: vimmax от Январь 17, 2008, 06:50:20



Название: Искусство программирования (задача 11)
Отправлено: vimmax от Январь 17, 2008, 06:50:20
Верен ли код?

Код: (cpp)
string f() { return "abc"; }

void g() {
  const string & s = f();
  cout << s << endl;
}


Название: Re: Искусство программирования (задача 11)
Отправлено: Sochin от Январь 17, 2008, 09:03:11
Как пишет дядя Саттер, код валидный. )


Название: Re: Искусство программирования (задача 11)
Отправлено: LazarusLong от Январь 17, 2008, 10:07:58
vimmax, +1 за отличный вопрос!


Название: Re: Искусство программирования (задача 11)
Отправлено: vimmax от Январь 18, 2008, 11:52:38
Sochin +1, раз ты сразу нашел Саттера, то придираться не буду :)

Создается ссылка на временный объект. Но тем не менее, с кодом все в порядке. Почему так? Потому что в С++ явно специфицировано, что если привязать временный объект к ссылке на const в стеке, то жизнь временного объекта будет продлена. Теперь он будет жить столько, сколько живет константная ссылка на него. В приведенном примере все валидно, время жизни s заканчивается с закрывающей фигурной скобкой.

Код: (cpp)
string f() { return "abc"; }

void g() {
  string& s = f();
  cout << s << endl;
}

невалидный код, наличие const'а тут важно. Правильный компилятор выдаст ошибку на этапе компиляции.

комменты к статье на русском Герба Саттера (http://alenacpp.blogspot.com/2008/01/const.html)

статья Герба Саттера об использовании const (eng) (http://herbsutter.spaces.live.com/blog/cns!2D4327CC297151BB!378.entry)