C++ 为什么带有switch语句的函数不';我不需要回报

C++ 为什么带有switch语句的函数不';我不需要回报,c++,visual-studio-2010,return,switch-statement,C++,Visual Studio 2010,Return,Switch Statement,如果Foo()中没有“return”,则可以在VS2010中编译和运行此代码。是编译器错误吗 要确认它是否可以运行,它不是编译器错误。丢失的返回不需要编译器进行诊断(但编译器可能会发出诊断),它会导致未定义的行为-任何情况都可能发生。警告:函数中没有返回非void[-Wreturn type]否,这是您的代码和开发实践中的一个错误,没有在最高警告级别上编译。感谢所有评论,根本原因是默认情况下抛出异常,然后编译器将其视为有效的退出点。如果我在开关大小写后添加一些代码,编译器报告警告C4715:'F

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


要确认它是否可以运行,它不是编译器错误。丢失的返回不需要编译器进行诊断(但编译器可能会发出诊断),它会导致未定义的行为-任何情况都可能发生。

警告:函数中没有返回非void[-Wreturn type]否,这是您的代码和开发实践中的一个错误,没有在最高警告级别上编译。感谢所有评论,根本原因是默认情况下抛出异常,然后编译器将其视为有效的退出点。如果我在开关大小写后添加一些代码,编译器报告
警告C4715:'Foo':并非所有控制路径都返回值
。如果我删除默认值,或者不返回或抛出默认值,编译器报告
错误C4716:“Foo”:必须返回一个值
@JohnDibling:yep,我关于警告级别的错误。如果函数从未返回,则没有return语句的函数完全有效,无论返回类型如何。无效的是到达函数的closing}(可能有一些您不应该依赖的异常),但例如,在函数末尾对abort()的无条件调用也是有效的。我知道这就是你的意思,但微妙的区别在于它解释了为什么编译器不能/不应该在没有return语句的情况下发出无条件警告。@BeersonicPasagorn如果没有return,编译器就更容易告诉函数永不返回。然而,我认为即使在那时也不需要诊断。只要删除默认值或抛出异常,编译器就可以报告
返回丢失了
@BeersonicPasagorn我知道,我只是说不需要。+1。标准编写者知道最好不要要求编译器报告诊断。这本质上就是停滞不前的问题。
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;
}