C++ 仅在调试模式下生成C4715

C++ 仅在调试模式下生成C4715,c++,visual-c++,visual-studio-2013,C++,Visual C++,Visual Studio 2013,你知道为什么下面的代码会生成警告C4715:'f':不是所有控制路径都在调试模式下返回值,但不是在发布模式下返回值吗?我正在使用Visual Studio 2013更新4进行构建 #include <stdexcept> __declspec(noreturn) void raiseerr() { throw std::runtime_error(""); } void raiseerr2() { raiseerr(); } int f(const int x) {

你知道为什么下面的代码会生成
警告C4715:'f':不是所有控制路径都在调试模式下返回值,但不是在发布模式下返回值吗?我正在使用Visual Studio 2013更新4进行构建

#include <stdexcept>

__declspec(noreturn) void raiseerr() {
  throw std::runtime_error("");
}

void raiseerr2() {
  raiseerr();
}

int f(const int x) {
  switch (x) {
  case 3:
  {
    return 54;
  }
    break;
  default:
    raiseerr2();
  }
}

int main() {
  return f(4);
}
#包括
__declspec(noreturn)无效提升器(){
抛出std::runtime\u错误(“”);
}
void raiser2(){
raiseer();
}
整数f(常数整数x){
开关(x){
案例3:
{
返回54;
}
打破
违约:
raiseerr2();
}
}
int main(){
返回f(4);
}

禁用优化时会出现警告(
/Od
)。这表明当启用优化时,
raiseerr2
在编译器检查C4715之前被省略

这导致问题的原因是我们通常只构建发布模式(因为构建速度更快),但切换到调试构建时失败(因为我们喜欢使用
/WX


解决方案是将
\u declspec(noreturn)
添加到
raiseer2
。还是觉得有点脏…

我觉得还可以。在C++11中,标准中有一个
[[noreturn]]
属性(VS2013可能不知道)。