Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Тернарная операция ? : Как работает?

#cpp


Пишу я, значит, лабу - надо организовать двойную очередь шаблонным классом и продемонстрировать
работу в main() - и тут до меня доходит, что я не знаю, как работает тернарная операция ?:
template
const TInfo& TDeque::GetFront() const
{
     return front ? front->info : 0;
}

Когда вызывал этот метод из main() для своего класса Man, то вызывался конструктор
копирования последнего в строчке return front ? front->info : 0; , а потом ещё и деструктор!
В результате программа вылетала (ну не должно было там ничего вызываться!). Но ведь
возвращаю я по ссылке!!! После двухчасового безрезультатного поиска ошибок данную функцию
переписал:
template
const TInfo& TDeque::GetFront() const
{
        if(front) 
            return front->info;
        return 0;
}

И всё работает!!! Никакие конструкторы/деструкторы не вызываются!
В чём отличие и почему первая так странно себя вела?    


Ответы

Ответ 1



В первом случае вызывается конструктор копирования TInfo(front->info) или конструктор TInfo(0) - тернарной операции надо второе и третье выражения обязательно привести к одному типу, если это возможно. Она это и делает. Поэтому получается, что возвращается ссылка на временный анонимный стековый объект в любом случае, даже вместо front->info. Во втором случае необходимость создания анонимного экземпляра возникает только в return 0; , что оказывается эквивалентно return TInfo(0); . В обоих случаях, видимо, не выдается предупреждение, т.к. возвращается const TInfo&. UPD: "видимо" - потому что не компилировал, нет сейчас возможности.

Ответ 2



Почитайте эту статейку на Хабре и многие вопросы я думаю отпадут

Комментариев нет:

Отправить комментарий