所以,我刚刚完成了一个大型服务器应用程序的艰苦的多小时调试会话。错误最终归结为构造函数中几乎没有明显的错字。基本上,它是这样的:
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 ... */
}
...
};
看到这个bug?好吧,我没有。问题是初始化列表中的一个小错误: 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
对自己:基本上为自己分配一个未初始化的引用?这本来可以节省我几个小时的烦恼。