常量引用:循环条件中使用的变量未在循环体中修改

问题描述 投票:0回答:1

我有一些这样的代码:

    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);
        }
    }
c++17
1个回答
0
投票

在第一个片段中

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

     }
 }
© www.soinside.com 2019 - 2024. All rights reserved.