我的初始值设定项列表中的小拼写错误会导致无法形容的痛苦
Small typo in my initializer list causes unspeakable pain
所以,我刚刚完成了一个大型服务器应用程序的耗时调试会话。 该错误最终归结为构造函数中几乎不明显的拼写错误。 基本上,它是这样的:
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&
。 那么 - 编译器没有警告我我在这里使用未初始化的变量有什么原因吗?
使用带有 -Wall
标志的 GCC 4.6,如果我说:
int x;
x = x;
。它将发出警告:warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
那么,为什么编译器在我为自己分配m_request
时没有警告我:本质上是为自己分配一个未初始化的引用? 这会为我节省数小时的烦恼。
要追踪的烦人错误。事实证明,您甚至不需要模板来默默地失败。这将解决问题:
class C {
int a, b;
public:
C(int t, int z) : a(a), b(z) { };
};
叮当用-Wuninitialized
警告这一点。
对于 gcc 人来说是个好消息:根据 gnu 的 bugzilla,gcc 4.7.0 已经解决了这个问题。
更新
在 gcc 4.7.0 上,添加-Wself-init
以获取此警告(由 sbellef 验证(:
tst.cc:在构造函数 'C::C(int, int(' 中: tst.cc:4:9: 警告: 'C::a' 用自身初始化 [-Wuninitialized]
使用与构造函数参数相同的成员名称的技巧。
template <class T>
request_handler(T& request, Log& error_log)
: request(request), error_log(error_log)
{
/*... some code ... */
}
这将始终防止错误。你必须小心,因为在函数体中request
引用参数,而不是成员。对于引用等简单类型,这当然无关紧要,但我不建议将其用于类。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'