Итак, я только что закончил с изнурительным многочасовым отладочным сеансом большого серверного приложения. Ошибка сошла до едва заметной опечатки в конструкторе. В принципе, это было что-то вроде:
template <class T>
class request_handler
{
public:
request_handler(T& request, Log& error_log)
: m_request(m_request), m_error_log(error_log)
{
/*... some code ... */
}
...
};
Посмотрите на ошибку? Ну, я этого не сделал. Проблема заключается в небольшой опечатке в списке инициализаторов: m_request(m_request)
присваивает себе неинициализированную ссылку. Очевидно, он должен читать m_request(request)
.
Теперь переменная-член m_request
имеет тип T&
. Итак - есть ли причина, по которой компилятор не предупредил меня, что я использовал здесь неинициализированную переменную?
Используя GCC 4.6 с флагом -Wall
, если я скажу:
int x;
x = x;
... он выдаст предупреждение: warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
Итак, почему компилятор не предупредил меня, когда я назначил m_request
себе: по существу присваивая себе неинициализированную ссылку на себя? Это избавило бы меня от досады.