В некоторой степени это выбор стиля .
Лично я считаю, что использование неявного преобразования типа bool должно быть ограничено вещами с семантикой, подобной указателю: фактические указатели, умные указатели, std::optional
приходить на ум. Это повсеместно в этом контексте и просто кажется естественным.
В других контекстах это кажется странным. Сообщите о своих намерениях как можно яснее! Опять же, на мой взгляд, if(!stack.empty())
передает намерение гораздо более ясно и прямо, чем if(stack.size())
.
Однако стиль - это еще не все. Если вы используете стиль размер , как правило, это может стать проблемой производительности , потому что вы полагаетесь на то, что и size()
, и empty()
будут одинаково быстрыми.
Представьте себе тип связанного списка, размер которого не сохраняется. Его функция empty()
по-прежнему работает быстро, потому что сводится к проверке одного указателя. Но его size()
должен пройти весь список, чтобы определить количество элементов. Это может быть гораздо более дорогостоящая операция.