Небольшая опечатка в моем списке инициализаторов вызывает невыразимую боль

Итак, я только что завершил изнурительную многочасовую сессию отладки большого серверного приложения. Ошибка в итоге свелась к едва заметной опечатке в конструкторе. По сути, это было что-то вроде:

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: по сути, присвоив себе неинициализированную ссылку? Это сэкономило бы мне часы раздражения.

11
задан Cody Gray 22 May 2012 в 11:42
поделиться