Диагностика выявляет случаи инициализации членов класса "плохим" указателем или ссылкой.
Пример:
class Foo { int *x; int &y; Foo(int a, int b); }; Foo::Foo(int a, int b) : x(&a), // <= y(b) // <= {};
Переменная 'x' является указателем, при инициализации ей присваивается адрес переменной 'a'. Переменная 'a' - аргумент и является локальной для конструктора, поэтому область ее видимости короче, чем у 'x'. После выхода из конструктора 'x' будет иметь неверный указатель.
То же самое верно и для ссылки 'y'.
Правильный вариант будет выглядеть таким образом:
class Foo { int *x; int &y; Foo(int *a, int &b) : x(a), y(b) {} }; Foo::Foo(int *a, int &b) : x(a), y(b), {} };
Теперь конструктору передаются адрес и ссылка напрямую, их область видимости все так же ограничена областью видимости конструктора, но область видимости их значений - нет.
Данная диагностика классифицируется как:
|