Итак, я только что завершил изнурительную многочасовую сессию отладки большого серверного приложения. Ошибка в итоге свелась к едва заметной опечатке в конструкторе. По сути, это было что-то вроде:
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;
... он выдаст предупреждение: предупреждение: 'x' используется неинициализированным в этой функции [-Wuninitialized]
Итак, почему компилятор не предупредил меня, когда я присвоил себе m_request
: по сути, присвоив себе неинициализированную ссылку? Это сэкономило бы мне часы раздражения.