if-else 块引发 "control reaches end of non-void function" 警告

if-else Block Raises a "control reaches end of non-void function" Warning

我正在创建一个基于以下几何形状的碰撞检查函数:直线、矩形和圆形。我写了一个 Line-Line 检查函数,看起来像这样:

bool check_collision(jLine L1, jLine L2, double singular_threshold=1e-6){
    /*Variable definitions omitted for brevity*/

    if (parallel){
        return false;
    }
    else if (infinite){
        return true;
    }
    else{
        jVector t;
        t = M.inverse()*(s2 - s1);
        double t1 = t.get_x(), t2 = t.get_y();

        on1 = (0. <= t1) and (t1 <= 1.);
        on2 = (0. <= t2) and (t2 <= 1.);

        if (seg1){
            if (not on1){
                return false;
            }
            else if (seg2){
                if (not on2){
                    return false;
                }
                else{
                    return true;
                }
            }
        }
        else{
            if (on2){
                return true;
            }
            else{
                return false;
            }
        }
    }
}

所有变量和类型都已正确定义,不会造成任何问题。但是,当我编译这段代码时,会发出 "control reaches end of non-void function" 的警告。此警告似乎表明我的 if-else 树包含一个没有 return 语句的分支。但是,据我所知,每个分支都以 bool 类型对象的 return 结束。我错过了什么吗?

当我在函数的最后添加一个 return true; 时警告被删除,但我觉得好像这不应该是必要的。我还假设只要使用 if-else 链,就会发出此警告。我用另一个完全由 if-elif-else 链组成的函数反驳了这一点:

bool check_collision(jRect R1, jRect R2){
    if (R2.left() > R1.right()){
        return false;
    }
    else if (R2.right() < R1.left()){
        return false;
    }
    else if (R2.top() > R1.bottom()){
        return false;
    }
    else if (R2.bottom() < R1.top()){
        return false;
    }
    else{
        return true;
    }
}

编译此函数时不会引发警告。任何人都可以阐明我所缺少的东西吗?任何帮助将不胜感激。

As far as I can tell, every branch ends in the return of a bool type object. Am I missing something?

嗯,是的。

        if (not on1){
            return false;
        }
        else if (seg2){
            if (not on2){
                return false;
            }
            else{
                return true;
            }
        }

在这部分代码中,您的 if 有一个 else if 但没有 else。如果 else 是 "triggered",则该函数会在遇到 return 语句之前用完代码。

编译器警告您您没有编写任何代码来处理 on1 && !seg2 时的情况。如果这个条件不可能,我们不能说,因为我们看不到seg2;但是,更重要的是,编译器也不能说。