对于非 void 函数没有 return 语句,其中控制永远不会结束,这是未定义的行为吗?

use*_*570 2 c++ function undefined-behavior language-lawyer c++14

我正在使用此处列出的书籍学习 C++ 。特别是,我读到从非 void 函数末尾流出是未定义的行为。然后我看了这个答案,上面写着:

在 C++ 中,仅从值返回函数的末尾流出始终是未定义的行为(无论函数的结果是否由调用代码使用)。在 C 中,仅当调用代码尝试使用返回值时,才会导致未定义的行为。

但在这个答案中我读到:

在 C/C++ 下,不从声称返回某些内容的函数中返回是合法的。

正如您在第一个引用的答案中看到的,用户说在 C++ 中它始终是 UB,但第二个引用的答案说它是合法的。他们似乎互相矛盾。

上面引用的 C++ 答案中哪一个是正确的?

我还有以下 C++ 示例:

int func(int a, int b)
{
    if(a > b)
    {
        return a;
    }
    else if(a < b)
    {
        return b;
    }
}

int main()
{
    int x =0, y =0;
    std::cin>> x >> y;
    
    
    
    
    if(x!=y)
    {
        func(x,y); //Question 1: IS THIS UB?
        std::cout<<"max is: "<<func(x,y); //Question 2: IS THIS UB?
    }
    else 
    {
        std::cout<<"both are equal"<<std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我从上面给出的代码片段中有两个问题,我在上面代码的注释中提到过。

从代码中可以看出,控制永远不会流过函数的末尾func,因为a永远不会等于b函数内部,因为我已经main单独检查了该条件。

Nic*_*las 8

这两种说法并不矛盾。

void第一条语句是关于当控制流退出非函数而不执行语句时会发生什么return。第二个陈述是关于当控制流根本不退出函数时会发生什么。对类似函数exitstd::terminate不具有控制流的函数的调用会在调用这些函数时继续进行。

但这与返回值的性质无关。

当非函数在没有显式语句(或. 或者现在)void的情况下耗尽了要做的事情时,程序的行为由[stmt.return]/2控制:returnthrowco_return

从函数末尾流出相当于没有值的返回;这会导致返回值函数中出现未定义的行为。