为什么用switch语句函数不需要返回

Bee*_*orn 2 c++ return visual-studio-2010 switch-statement

enum MyEnum
{
    A,
    B,
}

MyEnum Foo(int i)
{
    MyEnum mx;
    switch(i)
    {
    case 1:
        {
            mx = A;
        }break;
    case 2:
        {
            mx = B;
        }break;
    default:
        {
            throw std::exception("ERROR");
        }
    }
}

int Main()
{
    MyEnum myEnum = Foo(1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果没有Foo()中的'return',则可以在VS2010中编译和运行此代码.是编译器错误吗?

VS2010截图确认它可以运行

Luc*_*ore 8

它不是编译器错误.缺少的返回不需要编译器的诊断(但编译器可能会发出一个),并导致未定义的行为 - 任何事情都可能发生.

  • 如果函数永远不返回,没有return语句的函数完全有效,无论返回类型如何.什么是有效的是达到函数的结束}(可能有一些你不应该依赖的例外),但是例如在函数末尾无条件调用abort()也是有效的.我知道这就是你的意思,但微妙的区别很重要,因为它解释了为什么编译器不能/不应该只发出无条件警告,如果没有返回语句. (3认同)