我正在开发一个庞大的C ++项目,并且要有一些非常干净的东西,所有警告都会故意转为错误(使用g ++或clang ++标记-Werror
)。
我有一个模板类A:
template<int N> class A { ... };
根据N
的值,某些一般行为会有所不同。在A
的一个方法中,我有一个for循环:
for(int i = 0; i < M; i++) { ... }
在这个for循环声明中,M
是从N
计算的,它在编译时解析(编译求解常数的乘法)。
对于N
的某些值,有些情况下for循环等效于:
for(unsigned int i = 0; i < 0; i++) { ... }
但这是故意制作的,我只想让优化器删除循环。
使用g ++,没有问题。但是,使用clang ++,我得到:
error: comparison of unsigned expression < 0 is always false [-Werror,-Wtautological-compare]
这是显而易见的。
我的问题是:
是否有某种调整可以通过不考虑for循环来放弃此警告?我正在谈论一个暗示纯C ++代码的调整,没有clang-reserved pragma,因为我的代码必须同时使用g ++和clang ++。
我想过类似的事情:
if(M > 0) for(unsigned int i = 0; i < M; i++) { ... }
但这只是给出了同样的错误。有什么想法吗?
答案 0 :(得分:0)
我在撰写这篇文章时考虑过的解决方案是将unsigned int
替换为int
,并在需要时在for循环中使用static_cast<unsigned int>(i)
。但是我写这篇文章只是为了删除它。
无论如何,欢迎任何更优雅的解决方案!
答案 1 :(得分:0)
在c ++ 17中,您可以使用if constexpr
:
if constexpr (M > 0) {
for(unsigned int i = 0; i < M; i++) { ... }
}
在您使用专业化之前
template <std::size_t M>
void bar(/*...*/) {
for(unsigned int i = 0; i < M; i++) { ... }
}
template <>
void bar<0>(/*...*/) {
/* Empty */
}