Pull to refresh

Comments 6

Немного оффтоп, но недавно столкнулся с такой ошибкой:
class Foo {
Bar a;
int b = 0;
...

Foo()
: a( [this] () { ... } )
{
}
};

То есть поле класса инициализировалось при помощи лямбды. И это падало, потому что остальные поля ещё не проинициализированы, а лямбда их использовала через this, переданный в замыкании (лямбда сразу выполнялась).
PVS-Studio, а вы могли бы выдавать предупреждение на такие ситуации?

А если... В конструкторе базового класса вызывается не виртуальная функция, но которая сама вызывает виртуальную функцию?

Кстати, может быть и критическая ошибка, если вызов попадёт на pure virtual функцию.

Будет то же самое, наследник ещё не сконструирован, поэтому будет вызвана реализация из базового класса.

Это понятно, что будет тоже самое. Я про то, что правило "не вызывать виртуальные методы в конструкторе/деструкторе" как бы неполное, требуется ещё и не вызывать методы, которые вызывают виртуальные методы или ... (в общем тут рекурсия)

Правило же должно звучать не как «не вызывать виртуальные функции», а «вызывая виртуальные функции, не мечтать о вызове непонятно чего, а отдавать себе отчёт, что может быть вызвано, а что нет».

Sign up to leave a comment.