Sergey
т.е. порядок инициализации - вроде он такой
Sergey
список инициализации, затем инициализация в объявлении класса, затем уже тело конструктора
Sergey
я видимо не прав?
Sergey
в дебаггере погонял - так и есть
Sergey
какое-то. неважно. 2,4,8, ... - какие-то биты
Vladislav
может он про some_bitmask?
Sergey
это просто так
Sergey
там enum какой-то
Sergey
он подчеркивает именно переменную m_flags
Sergey
которую я тут value обозвал
🦥Alex Fails
скорее всего, семантика решарпера бажит, и думает ,что вал не инициализирован внутри конструктора
Sergey
а еще вот такая штука. если в конструкторе класса зовется виртуальная функция из этого же класса - идет такой ворнинг
Sergey
что-то вроде virtual function will be resolved statically
Vladislav
а вот тут он прав
Sergey
показал коллегам - они говорят, вообще нельзя вызывать виртуальные функции в конструкторе
Sergey
как оно обстоит дело
Vladislav
формально можно, но это как себе по ногам стрелять - не рекомендуется
Sergey
идем дальше
Sergey
нашелся участок, где виртуальная функция вызывалась в декструкторе
Sergey
тот же самый ворнинг. коллеги сказали - ерунда, в деструкторе все норм
Sergey
но неуверенно
Sergey
предположили, что может у них там для симметрии в решарпере так сделали. один ворнинг на ctor/dtor
Artem
Нет, и там и там логика одна и та же, это будет реализация функции из этого класса
Vladislav
в деструкторе тоже не норм - на момент выполнения деструктора базового класса дети уже задестракчены
Artem
Не из сына
Vladislav
обычно - ошибка
Sergey
т.е. все же работает прекрасно. высказали мнение, что под другим комплилятором может и не работать
Vladislav
в том смысле что так делать в продакшн-коде опасно
Sergey
случай-то нифига не искуственный
Artem
Нет, дело в том, что когда ты пишешь вызов виртуальной функции, ты можешь ожидать, что вызовется перегруженная
Artem
И это предупреждение
Sergey
вот представьте, что нужно перед удалением класса выполнить некий deinit
Artem
Сродни предупреждению if(a = b)
Sergey
и он виртуальный
Artem
Этот код не ошибка, но подозрительный
Sergey
ну и как? заставить пользователя писать cl->deinit; delete cl;
Artem
и он виртуальный
А почему он виртуальный?
Sergey
а потому что есть 2 реализации. под d3d и openGL
Sergey
deinit выполняет совершенно разные действия
Artem
А почему в деструкторе не написать вызов своих деинитов
Sergey
а деструктор у них одинаковый. deinit, четотам clear и все
Vladislav
ну так и вызывай его в соответствующих дочерних деструкторах
Artem
Зачем общий метод?
Sergey
продублировал логику
Sergey
не настолько неудобно, чтобы вешаться - но неудобно
Vladislav
ну вот иначе не сделать, в рамках того как в c++ сделано наследование
Sergey
окей. я просто убедился, что верно понял суть происходящего
Sergey
вообще, удивлен, насколько разные вещи мне находят PVS studio, cppcheck и resharper
Sergey
совсем разные. надо гонять все три
Sergey
а, и в vs2017 же есть анализатор.
Artem
Были бы у тебя коверити или клокворк или мы, находили бы еще разные
Artem
Статический анализ сложная штука)
Sergey
в целом, решарпер мне пока не нравится
Artem
Начиная с определения ошибки
Sergey
посижу на нем до конца триалки
Sergey
по местами он просто мешает
Sergey
из понравившегося - находит бесполезные #include, #define - секции
Vladislav
clang-tidy еще добавьте
Sergey
из непонравившегося - мания писать "этот метод можно сделать static/const" в случаях, когда нельзя на самом деле
Sergey
т.е. побитово-то он конст, а по сути нет
Sergey
лезет в неконстантный метод по ссылке
Sergey
кому-то может и норм, а я const понимаю все-таки как аналог "чистой функции"
Sergey
иначе самообман
Artem
В крестах все самообман
Vladislav
кстати, с каких пор вообще resharper умеет плюсы анализировать?
Sergey
вроде полгода уже умеет
Vladislav
там анализатор из clion'а?
Sergey
не знаю. может быть
Artem
Мне казалось, они давно умеют
Sergey
еще что понравилось: кликаешь по интерфейсной функции, тебе показывают все ее реализации, и можешь перейти к нужной
Sergey
т.е. goto definition/declaration намного более удобный
Sergey
а вот что не понравилось: контекстный поиск, или как это назвать. список, который вываливается когда пишешь
Artem
Они специализируются на супер быстром анализе и тулзах для быстрой разработки и рефакторинга
Алдар
Почему вызывать виртуальные функции из конструктора плохо? Она же просто ведет себя как не виртуальная
Sergey
вот написал ты строчку: some_class_instance->