Страницы

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

четверг, 25 октября 2018 г.

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

Пишу я, значит, лабу - надо организовать двойную очередь шаблонным классом и продемонстрировать работу в 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; } И всё работает!!! Никакие конструкторы/деструкторы не вызываются! В чём отличие и почему первая так странно себя вела?


Ответ

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

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

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