通常,当我从集合中擦除元素时,我想断言它实际上已被删除: 即
assert(s.erase(e));
但是当设置NDEBUG时,元素不会被删除。但如果我写
bool removed = s.erase(e);
assert(removed);
编译器抱怨在设置NDEBUG时未使用'removed'。
我该怎么做?
我最后只是创建了一个实用工具方法:
inline void run_and_assert(bool b) {
assert(b);
}
现在我可以说
run_and_assert(s.erase(e));
这有什么缺点吗?对我而言,这比luiscubal的解决方案更简单
答案 0 :(得分:8)
第一个例子是错误的,因为在定义NDEBUG时将删除断言表达式,因此根本不会调用s.erase(e)
。
assert
的论点不应该有副作用。
第二种方法更好,虽然警告可能确实很烦人,但是there are ways to silence the warning。
或者,您可以提出自己的断言语句,该语句始终执行代码。
#ifdef NDEBUG
#define assert_always_execute(x) (x)
#else
#define assert_always_execute(x) assert(x)
#endif
答案 1 :(得分:0)
我写了自己喜欢luiscubal的建议,除了丑陋#define之外我做了一个简短的内联方法:
inline void assert_always_execute(bool x) {
assert(x);
}