http://alenacpp.blogspot.com/
Например, я только что нашёл интересный пример о константных ссылках (в свою очередь Алёна нашла этот пример в блоге знаменитого Герба Саттера http://herbsutter.spaces.live.com/blog/cns!2D4327CC297151BB!378.entry):
ЦИТИРУЮ ИЗ БЛОГА АЛЁНЫ (http://alenacpp.blogspot.com/2008/01/const.html):
Возможно, самый важный const
Герб Саттер у себя в блоге рассказывает про интересный случай с использованием const.
Краткий пересказ для ленивых.
string f() { return "abc"; }
void g() {
const string& s = f();
cout < < s < < endl; // можно ли использовать временный объект?
}
Код несколько напрягает. Создается ссылка на временный объект. Но тем не менее, с кодом все в порядке. Почему так? Потому что в С++ явно специфицировано, что если привязать временный объект к ссылке на const в стеке, то жизнь временного объекта будет продлена. Теперь он будет жить столько, сколько живет константная ссылка на него. В приведенном примере все валидно, время жизни s заканчивается с закрывающей фигурной скобкой.
Это все относится только к объектам в стеке. На члены класса это не действует.
С++ это специфицирует, а как оно в реальности, работает? Герб проверил в нескольких компиляторах, нормально, практически во всех работает.
Легким движением руки убираем const...
И получаем невалидный код, наличие const'а тут важно. Правильный компилятор выдаст ошибку на этапе компиляции.
string f() { return "abc"; }
void g() {
string& s = f(); // все еще нормально?
cout < < s < < endl;
}
И есть еще момент с вызовом деструктора.
Derived factory(); // construct a Derived objectСсылки по теме:
void g() {
const Base& b = factory(); // здесь вызов Derived::Derived
// … используем b …
} // здесь вызывается Derived::~Derived напрямую
//-- а не Base::~Base + virtual dispatch!
Использование const. Часть 1.
Использование const. Часть 2.
КОНЕЦ ЦИТАТЫ
Комментариев нет:
Отправить комментарий