我有一些这样的代码:
void splay(const size_t x) {
for (const size_t& nxfa = nodes.at(x).father; nxfa;) {
normalize(nxfa);
const Node& nf = nodes.at(nxfa);
if (nf.lch) normalize(nf.lch);
if (nf.rch) normalize(nf.rch);
rotate(x == nf.lch ? 'R' : 'L', x);
}
}
在 for 循环条件下,clang-diagnostic-for-loop-analysis 工具抱怨“循环条件中使用的变量‘nxfa’未在循环体中修改。”
但是,内联函数调用rotate会修改nxfa引用的对象,只是我们不使用nxfa(const_reference)来修改它。
这是合法的用法,所以只是工具的误报,对吗?谢谢。
顺便说一句,现在我可以通过以下代码解决它:
void splay(const size_t x) {
while (nodes.at(x).father) {
const size_t nxfa = nodes.at(x).father;
normalize(nxfa);
const Node& nf = nodes.at(nxfa);
if (nf.lch) normalize(nf.lch);
if (nf.rch) normalize(nf.rch);
rotate(x == nf.lch ? 'R' : 'L', x);
}
}
在第一个片段中
nxfa
是const
。没有什么可以改变它,否则它就会是UB。代码将生成并可以执行,就好像 UB 从未发生过一样。
循环中
for (const size_t& nxfa = nodes.at(x).father; nxfa;)
表达式
nodes.at(x).father
只计算一次,因此迭代之间没有任何变化。您可以将其写为:
{
const size_t& nxfa = nodes.at(x).father
while(nxfa) { // this is a constant
}
}